Android14新特性 开启前台service服务

1. Android14新特性

1.1. 场景

  在Android14(targetSDK=34)系统手机开启前台service服务崩溃

ATAL EXCEPTION: mainProcess: com.inspur.lbrd, PID: 15634java.lang.RuntimeException: Unable to create service com.inspur.lbrd.service.KeepAliveService: android.app.MissingForegroundServiceTypeException: Starting FGS without a type  callerApp=ProcessRecord{957facf 15634:com.inspur.lbrd/u0a352} targetSDK=34at android.app.ActivityThread.handleCreateService(ActivityThread.java:5182)at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2638)at android.os.Handler.dispatchMessage(Handler.java:108)at android.os.Looper.loopOnce(Looper.java:226)at android.os.Looper.loop(Looper.java:328)at android.app.ActivityThread.main(ActivityThread.java:9128)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)Caused by: android.app.MissingForegroundServiceTypeException: Starting FGS without a type  callerApp=ProcessRecord{957facf 15634:com.inspur.lbrd/u0a352} targetSDK=34at android.app.MissingForegroundServiceTypeException$1.createFromParcel(MissingForegroundServiceTypeException.java:53)at android.app.MissingForegroundServiceTypeException$1.createFromParcel(MissingForegroundServiceTypeException.java:49)at android.os.Parcel.readParcelableInternal(Parcel.java:4884)at android.os.Parcel.readParcelable(Parcel.java:4866)at android.os.Parcel.createExceptionOrNull(Parcel.java:3066)at android.os.Parcel.createException(Parcel.java:3055)at android.os.Parcel.readException(Parcel.java:3038)at android.os.Parcel.readException(Parcel.java:2980)at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:7415)at android.app.Service.startForeground(Service.java:775)at com.inspur.lbrd.service.KeepAliveService.setForeground(SourceFile:118)at com.inspur.lbrd.service.KeepAliveService.onCreate(SourceFile:32)at android.app.ActivityThread.handleCreateService(ActivityThread.java:5169)at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2638) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loopOnce(Looper.java:226) at android.os.Looper.loop(Looper.java:328) at android.app.ActivityThread.main(ActivityThread.java:9128) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 

在这里插入图片描述

1.2. 解决方案

1.2.1. 在清单文件AndroidManifest.xml添加权限和配置

 <!-- android14前台常住服务权限--><uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
  <serviceandroid:name=".service.KeepAliveService"android:foregroundServiceType="location" />

1.2.2. 授权

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {// 定位权限requestPermissionLauncher.launch(Manifest.permission.ACCESS_COARSE_LOCATION);requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION);requestPermissionLauncher.launch(Manifest.permission.ACCESS_BACKGROUND_LOCATION);}
    ActivityResultLauncher<String> requestPermissionLauncher= registerForActivityResult(new ActivityResultContracts.RequestPermission(),result -> {if (result.equals(true)) {//权限获取到之后的动作} else {//权限没有获取到的动作}});

1.2.3. service服务

public class KeepAliveService extends Service {private final String TAG = "szyj_GridTraceS-";public KeepAliveService() {}@Overridepublic void onCreate() {super.onCreate();// 添加常驻通知栏setForeground();// startXcService();}private void startXcService() {try {String patrolStatus = SpUtil.getInstance(this).getString(GridTraceConstant.SP_PATROL_STATUS,GridTraceConstant.SP_PATROL_STATUS_FALSE);//巡查服务已开启if (TextUtils.equals(patrolStatus, GridTraceConstant.SP_PATROL_STATUS_TRUE)) {if (!ServiceUtil.isServiceRunning(this, GridTraceService.class.getName())) {startService(new Intent(this, GridTraceService.class));}} else {//未开启巡查服务if (ServiceUtil.isServiceRunning(this, GridTraceService.class.getName())) {stopService(new Intent(this, GridTraceService.class));}}} catch (Exception e) {e.printStackTrace();}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//可将onStartCommand() 方法的返回值设为 START_STICKY或START_REDELIVER_INTENT ,//该值表示服务在内存资源紧张时被杀死后,在内存资源足够时再恢复。//也可将Service设置为前台服务,这样就有比较高的优先级,在内存资源紧张时也不会被杀掉。return START_STICKY;//return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();// 删除图标stopForeground(true);}@Overridepublic IBinder onBind(Intent intent) {throw new UnsupportedOperationException("Not yet implemented");}/*** 添加常驻通知栏*/private void setForeground() {NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);String notificationId = "serviceid";String notificationName = "servicename";int noticeId = 2;Notification.Builder builder = new Notification.Builder(this);//创建NotificationChannelif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationChannel channel = new NotificationChannel(notificationId,notificationName, NotificationManager.IMPORTANCE_HIGH);channel.enableLights(true);//设置高亮(选填)channel.setShowBadge(true);//设置角标(选填)//设置锁屏可见(选填)channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);notificationManager.createNotificationChannel(channel);builder.setChannelId(notificationId);}Intent intent = new Intent(KeepAliveService.this, MainActivity.class);PendingIntent pendingIntent;//Android12if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {pendingIntent = PendingIntent.getActivity(this,123, intent, PendingIntent.FLAG_IMMUTABLE);} else {pendingIntent = PendingIntent.getActivity(this,123, intent, PendingIntent.FLAG_ONE_SHOT| PendingIntent.FLAG_MUTABLE);}builder.setSmallIcon(R.mipmap.icon_app).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.icon_app)).setContentTitle(getString(R.string.app_name))//选填.setContentText(getString(R.string.app_name))//选填.setWhen(System.currentTimeMillis()).setContentIntent(pendingIntent);Notification notification = builder.build();startForeground(noticeId, notification);}
}

1.2.4. 启动service服务

  if (!ServiceUtil.isServiceRunning(this, KeepAliveService.class.getName())) {startService(new Intent(this, KeepAliveService.class));}

&emsp;&emsp;判断服务是否开启

public class ServiceUtil {/*** @param context* @param className service后台服务名称* @return* @desc 查询service是否在运行*/public static boolean isServiceRunning(Context context, String className) {ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningServiceInfo> serviceList = activityManager.getRunningServices(Integer.MAX_VALUE);if (!(serviceList.size() > 0)) {return false;}for (int i = 0; i < serviceList.size(); i++) {ActivityManager.RunningServiceInfo serviceInfo = serviceList.get(i);ComponentName serviceName = serviceInfo.service;if (serviceName.getClassName().equals(className)) {return true;}}return false;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/312488.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程PPT 笔记摘录(2)

分析软件需求 UML 提供了用例图来分析和描述用例视角的软件需求模型 UML 提供了交互图和状态图来描述行为视角的软件需求模型 UML 提供了类图来描述和分析业务领域的概念模型 顺序图&#xff1a;强调消息传递的时间序 通信图&#xff1a;突出对象间的合作 类图&#xff0…

使用docker build构建image

文章目录 环境步骤准备例1&#xff1a;基本用法例2&#xff1a;缓存layer例3&#xff1a;Multi-stage例4&#xff1a;Mountcache mountbind mount 例5&#xff1a;参数例6&#xff1a;Export文件例7&#xff1a;测试 参考 环境 RHEL 9.3Docker Community 24.0.7 步骤 在Dock…

Android 实现 Slots 游戏旋转效果

文章目录 前言一、效果展示二、代码实现1.UI布局2.SlotAdapter2.SlotsActivity 总结 前言 slots游戏&#xff1a; Slots游戏是一种极具流行度的赌博和娱乐形式&#xff0c;通常被称为老虎机或水果机。它们在赌场、线上游戏平台和手机应用中广泛存在。一般这类游戏都使用Unity…

硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件扩展 (SHE)的区别

术语 硬件安全模块 (HSM) &#xff1a;Hardware Security Modules硬件安全引擎 (HSE) &#xff1a;Hardware Security Engines安全硬件扩展 (SHE) &#xff1a; Secure Hardware Extensions 介绍 在汽车行业中&#xff0c;硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件…

HTML与CSS

目录 1、HTML简介 2、CSS简介 2.1选择器 2.1.1标签选择器 2.1.2类选择器 2.1.3层级选择器(后代选择器) 2.1.4id选择器 2.1.5组选择器 2.1.6伪类选择器 2.2样式属性 2.2.1布局常用样式属性 2.2.2文本常用样式属性 1、HTML简介 超文本标记语言HTML是一种标记语言&…

Spring Cloud + Vue前后端分离-第10章 基于阿里云OSS的文件上传

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第10章 基于阿里云OSS的文件上传 前面介绍的文件上传是基于本地文件服务器的文件上传&#xff0c;但是自己搭文件服务器会有很多运维的问题&#xff0c;比如磁盘满了要扩容…

第一节 Linux操作系统简介

一&#xff1a;Linux的发展历史 1&#xff1a;1969年美国贝尔实验室的肯• 汤普森开发出了UNIX系统。   2&#xff1a;1973年&#xff0c;UNIX系统的绝大部分源代码用C语言重写&#xff0c;为提高UNIX系统的可移植性打下基础。   3&#xff1a;Linux系统诞生于1991年&#…

前端实现埋点监控

文章目录 一、埋点&监控二、前置知识1. 区分JS模块化2. rollup3. History3.1 history.pushState()3.2 history.replaceState()3.3 popstate事件 4. JS二进制4.1 Blob4.2 File4.3 FileReader4.4 ArrayBuffer4.5 Object URL4.6 Base644.7 格式转换 5. sendBeacon发送请求 三、…

【AI】人类视觉感知特性与深度学习模型(2/2)

目录 二、人类视觉感知特性对深度学习模型的启发 2.1 视觉关注和掩盖与调节注意力模型的关系 1.视觉关注和掩盖 2. 注意力机制模型 2.2 对比敏感度与U形网络的联系 2.3 非局部约束与点积注意力的联系 续上节 【AI】人类视觉感知特性与深度学习模型&#xff08;1/2&#…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存(CustomData)功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存&#xff08;CustomData&#xff09;功能&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据保存&#xff08;CustomData&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff…

【后端】Docker学习笔记

文章目录 Docker一、Docker安装&#xff08;Linux&#xff09;二、Docker概念三、Docker常用命令四、数据卷五、自定义镜像六、网络七、DockerCompose Docker Docker是一个开源平台&#xff0c;主要基于Go语言构建&#xff0c;它使开发者能够将应用程序及其依赖项打包到一个轻…

Visual Studio 2015 中 SDL2 开发环境的搭建

Visual Studio 2015 中 SDL2 开发环境的搭建 Visual Studio 2015 中 SDL2 开发环境的搭建新建控制台工程拷贝并配置 SDL2 开发文件拷贝 SDL2 开发文件配置 SDL2 开发文件 测试SDL2 开发文件的下载链接 Visual Studio 2015 中 SDL2 开发环境的搭建 新建控制台工程 新建 Win32 …