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前台服务问题 :startForegroundService() not allowed due to mAllowStartForeground false`最近Google也是推出了Android12,在写项目的时候也是发现了一个适配Android12需要注意的问题以 Android 12 为目标平台的应用在后台运行时无法再启动前台服务,但一些特殊情况除外。如果应用在后台运行时尝试启动前台服务,并且前台服务不符合任何特殊情况,则系统会抛出 ForegroundServiceSta
(四十二)Context.startForegroundService() did not then call Service.startForeground
通常在Service的onStartCommand()方法中回调startForeground()方法,避免10s超时发生ANR。 Context context = getApplicationContext(); Intent intent = new Intent(...); // Build the intent for the service context.startForegroundService(intent); startForeground()方法中需要传入唯一标识
代码可以直接运行,实现了android平台服务前台化,并以Notification显示到右下脚。代码可以在任何版本API运行。考虑了各种版本的API情况。内部使用了发射机制。 简略说下服务前台化的好处:即提高了服务的优先级别,普通服务是默认后台运行的。当android系统发现内存不够时,极易自动killed掉你的服务。如果,改用前台则不易被killed,当然,内存极度低时同样会killed。 本代码来源于对android的apidemos的研究。
12-13 10:41:07.520 16661 16661 E AndroidRuntime: FATAL EXCEPTION: main 12-13 10:41:07.520 16661 16661 E AndroidRuntime: Process: cn.xxx.xxxxx:remote, PID: 16661 12-13 10:...
文章目录了解低电耗模式将应用调整到低电耗模式了解应用待机模式对其他用例的支持在低电耗模式和应用待机模式下进行测试 了解低电耗模式 如果用户设备未插接电源、处于静止状态一段时间且屏幕关闭,设备会进入低电耗模式。 在低电耗模式下,系统会尝试通过限制应用对网络和 CPU 密集型服务的访问来节省电量。 这还可以阻止应用访问网络并推迟其作业、同步和标准闹铃。 系统会定期退出低电耗模式一会儿,好让应用完成其已...
Android前台Service 是指一个能够在Notification栏中显示通知的Service。通过前台Service,在后台运行时,用户可以看到一个通知,以此提示用户该服务正在运行。前台ServiceAndroid系统中用于一些比较重要的服务,比如音乐播放器、即时通讯、闹钟、导航等等。在应用程序需要长时间后台运行时,可使用前台Service。 在使用前台Service时,需要在Service中创建并设置Notification通知。其中,Notification通知是用户与Service进行交互的唯一方式,当通知被点击时,可以通过Intent来启动或停止Service。 对于一些比较耗电的服务,如GPS定位、音乐播放器等,使用前台Service可以避免在后台运行时被系统杀死,从而保证服务持续稳定运行,提高用户体验。 但是需要注意,虽然前台Service可以提高进程的优先级,但是在使用时需注意不要过度使用,因为长时间占用内存、耗电量过大,也会对用户造成不良影响。因此,在使用前台Service时,需权衡其重要性和对系统资源的影响,以达到合理使用的目的。