API 级别 24 中的前台服务 - Android 7.0 Nougat

Posted

技术标签:

【中文标题】API 级别 24 中的前台服务 - Android 7.0 Nougat【英文标题】:Foreground service in API Level 24 - Android 7.0 Nougat 【发布时间】:2018-10-09 19:49:04 【问题描述】:

我的问题是针对 API LEVEL 24 - android 7.0 Nougat。 我正在尝试找到最合适且面向未来的方式来启动粘性前台服务。 总结: - 按下按钮后需要从活动中启动服务 - 将创建一个(粘性 - 这将由通知标志处理)通知

在 API 级别 26 中,我们可以调用 startForegroundService(service, notification) 并且服务会自动关联到通知。 但是在 API 级别 24 中,服务以 startService(service) 启动,并通过调用 NotificationManagerCompat 的 notify 方法显示通知。 怎么让操作系统知道通知是和服务相关的,所以服务被认为是前台服务,操作系统永远不会自己杀死。

注意:我想要这个实现的原因是为了面向未来。此服务需要位置更新,从 API 级别 26 开始,只有前台服务(带有粘性通知)能够接收实时更新 (https://developer.android.com/about/versions/oreo/background-location-limits)。

【问题讨论】:

【参考方案1】:

我们如何让OS知道通知与服务相关,所以服务被认为是前台服务

在服务中调用startForeground(),提供Notification。您也需要在 Android 8.0+ 上执行此操作。

操作系统永远不会自行杀死

从未如此。它只是降低了 Android 终止您的进程的可能性。

【讨论】:

StartForeground 在 api 级别 24 上不可用。那是我的问题 @AlexandrosD: startForeground() 从 API 级别 5 开始就存在了:developer.android.com/reference/android/app/… 哦,我明白了 - startForeground 是一个服务方法,所有通知相关的代码都需要由服务管理 - 很抱歉造成混乱。 有没有人知道一种实现服务的方法,该服务永远不会被 Android 终止? @ThePartyTurtle:构建您自己的自定义 ROM 并将您的逻辑实现为标准 Linux 守护进程。

以上是关于API 级别 24 中的前台服务 - Android 7.0 Nougat的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 12 中使用 WorkManager

应用程序卡在 Android 12(API 级别 31)的初始屏幕上

android api 16 中的 BigDecimal

在 Android 12 中使用 WorkManager

使用 Android MediaRecorder 暂停和恢复(API 级别 < 24)

调用需要 API 级别 24(当前最低为 8):新的 android.location.GnssStatus.Callback