startForegroundService() not allowed due to mAllowStartForeground false

`
最近Google也是推出了Android12,在写项目的时候也是发现了一个适配Android12需要注意的问题
以 Android 12 为目标平台的应用在后台运行时无法再启动前台服务,但一些特殊情况除外。如果应用在后台运行时尝试启动前台服务,并且前台服务不符合任何特殊情况,则系统会抛出 ForegroundServiceStartNotAllowedException

官方也是给了前台服务的推荐替代方案:WorkManager

从 WorkManager 2.7.0 开始,您的应用可以调用 setExpedited() 来声明 Worker 应使用加急作业。这一新 API 在 Android 12 上运行时使用加急作业,该 API 在早期 Android 版本中使用前台服务来提供向后兼容性。

以下代码段展示了关于如何使用 setExpedited() 方法的示例:

OneTimeWorkRequestBuilder<T>().apply {setInputData(inputData)setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
}.build()

—由于 CoroutineWorker.setForeground() 和 ListenableWorker.setForegroundAsync() 方法由前台服务提供支持,因此它们受到相同的前台服务启动限制和豁免。您可以适时地使用该 API,但如果系统不允许您的应用启动前台服务,您应准备好处理异常。为了获得更加一致的体验,请使用 setExpedited()。

允许从后台启动前台服务的情况:

在以下情况下,即使您的应用在后台运行,也可以启动前台服务:

  1. 您的应用从用户可见的某种状态(如 activity)过渡。
  2. 您的应用可以从后台启动 activity,但该应用在现有任务的返回堆栈中具有 activity 的情况除外。
  3. 您的应用使用 Firebase Cloud Messaging 接收高优先级消息。
  4. 用户对与您的应用相关的界面元素执行操作。例如,他们可能与气泡、通知、微件或 activity 互动。
  5. 您的应用收到与地理围栏或运动状态识别过渡相关的事件。
  6. 设备重新启动并在广播接收器中接收 ACTION_BOOT_COMPLETED、ACTION_LOCKED_BOOT_COMPLETED 或 ACTION_MY_PACKAGE_REPLACED intent 操作之后。
  7. 您的应用在广播接收器中接收 ACTION_TIMEZONE_CHANGED、ACTION_TIME_CHANGED 或 ACTION_LOCALE_CHANGED intent 操作。
  8. 您的应用接收需要 BLUETOOTH_CONNECT 或 BLUETOOTH_SCAN 权限的蓝牙广播。
  9. 应用包含特定系统角色或权限,例如设备所有者和配置文件所有者。
    您的应用使用配套设备管理器。
  10. 为了每当配套设备在附近时都让系统唤醒您的应用,请在 Android 12 中实现配套设备服务。
  11. 系统重启“粘性”前台服务。为使前台服务具有粘性,请从 onStartCommand() 返回 START_STICKY 或 START_REDELIVER_INTENT。
  12. 用户为您的应用关闭了电池优化。您可以将用户引导至您的应用在系统设置中的应用信息页面,帮助用户找到此选项。为此,请调用包含 ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS intent 操作的 intent。

Android12前台服务问题相关推荐

  1. 前台服务(在通知栏显示服务)

    关键代码: public class MyService extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) ...

  2. Android开发之如何保证Service不被杀掉(前台服务)

    序言 最近项目要实现这样一个效果:运行后,要有一个service始终保持在后台运行,不管用户作出什么操作,都要保证service不被kill.参考了现今各种定制版的系统和安全厂商牛虻软件,如何能保证自 ...

  3. android8.1启动前台服务,Android - 保活(1)前台服务保活

    老婆保佑,代码无BUG 前言 项目中遇到一个需求,需要竟可能的上传用户的定位信息,引发了我对目前已知的保活手段的探究,同时也遇到过客户说,推送不能收到,不能像微信那样,MMP的,不想理客户 目录 一: ...

  4. android 前台服务自定义布局不显示_Android前台服务通知未显示

    我正在尝试启动前台服务.我收到通知,该服务确实启动但通知始终被抑制.我仔细检查了应用是否允许在我的设备上的应用信息中显示通知.这是我的代码: private void showNotification ...

  5. java stopself_如何正确停止前台服务?

    我不知道它是否正确,但在我的应用程序中,我正在停止前台服务,它可以工作.请检查代码 private void stopForegroundService() { // Stop foreground ...

  6. android9 前台服务通知_Android通知概览

    通知是指 Android 在应用界面之外显示的消息,旨在向用户提供提醒.来自他人的通信信息或应用中的其他及时信息.用户可以点按通知来打开应用,或直接从通知中执行操作. 此页面将概述通知的显示位置和可用 ...

  7. 安卓服务service全解,生命周期,前台服务、后台服务,启动注销、绑定解绑,注册

    全栈工程师开发手册 (作者:栾鹏) python教程全解 定义服务(服务的生命周期) 调用context.startService()时依次执行 ->onCreate()- >onStar ...

  8. android开启前台服务_Android 知识点必知之ANR与OOM

    ANR ANR 简介 ANR 全称 (Application Not responding):指的是应用程序未响应,Android 系统对于事件的处理需要在一定时间内完成,如果超过该时间没有得到响应, ...

  9. 前台服务 StartForeground

    一.如何保活后台服务 在Android Services (后台服务) 里面,我们了解了Android四大组件之一的Service,知道如何使用后台服务进行来完成一些特定的任务.但是后台服务在系统内存 ...

  10. 检查App是否有在后台启动前台服务的行为命令

    可在Terminal终端执行以下adb命令,该命令会监控你的App是否有在后台启动前台服务的行为,一旦有此行为,就会在通知栏推送一条提醒,定位到触发此行为的代码处: adb shell device_ ...

最新文章

  1. python搜索关键词自动提交订单_Python批量获取淘宝相关搜索和下拉框关键词
  2. 【bzoj4916】神犇和蒟蒻 杜教筛
  3. 利用tar命令备份Linux系统
  4. PYQT中QThread输出到textBrowser
  5. php 二分查找字符串,php实现的二分查找算法示例
  6. 第二增长曲线:如何发现击穿破局点的单一要素?
  7. 工厂供电MATLAB仿真,工厂供电课程设计---基于MATLAB的电力电子系统仿真
  8. CSS 块状元素和内联元素
  9. jxl 导入导出Excel(有模板)
  10. 调用shell jenkins不能自动结束
  11. Http断点下载实简单讲解
  12. 移动机会网络中的节点分簇路由算法
  13. 2021年最新版Git一天入门教程
  14. SysWow64和System32
  15. linux的idr机制
  16. c# excel文档导入及excel存储数据库
  17. Muli3D 7 判断Ray与Sphere的关系
  18. git fetch批处理,遍历一个文件夹下的所有子目录,执行git fetch --all
  19. 软件测试工程师未来发展前景
  20. Ubuntu 16.04 安装php的拓展yac

热门文章

  1. 笔记本电脑CPU低压、标压、高压的区别
  2. 移动网络通信技术【移动电话网络介绍】
  3. mysql查询本月第一周_mysql获取当前日期所在周(原则:每年1月1号所在周为第一周,最少1天,12月31日为最后一周)...
  4. 彩虹网盘外链程序源码V5.1|网盘外链源码
  5. felix 与Phoenix 发音 n和l的分辨
  6. 食品科学与工程与计算机论文,2010食品科学与工程专业毕业论文
  7. u盘数据恢复软件哪个好?怎么恢复u盘数据?
  8. Ubuntu 配置磁盘挂载到指定目录
  9. PdgCntEditor一键生成PDF书签目录
  10. 2020 对自己的要求(专注力,执行力,心态)