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(API 级别 31)的初始屏幕上
使用 Android MediaRecorder 暂停和恢复(API 级别 < 24)
调用需要 API 级别 24(当前最低为 8):新的 android.location.GnssStatus.Callback