java - 触发更新后应用程序销毁后通知被解除
问题描述
android 文档指出,要启动服务,onStartCommand
必须实现。当我创建service
, 并使用 启动服务ContextCompat.startForegroundService(...)
时,它的onStartCommand
方法被执行,此时即使我退出应用程序,服务也不会停止(如预期的那样)。
但是,后来当我通过更改显示的文本来更新通知时,我使用了该notificationManager.notify()
方法,现在当我退出应用程序时,服务会自动停止。我想知道我们是否应该在每次通知更新时强制调用 onStartCommand,不知何故(比如我们应该用 更新通知ContextCompat.startForegroundService
吗?我已经从api level 19
to测试过api level 27
了,行为都是一样的。我怎样才能将服务的属性维护为started
即使在我更新通知之后?
解决方案
我想知道我们是否应该
onStartCommand
在每次通知更新时强制调用,
不,您不会被迫调用onStartCommand
每个通知更新
不知何故(比如我们应该用 更新通知
ContextCompat.startForegroundService
吗?我已经从 API 级别 19 测试到 API 级别 27 并且行为都是一样的。即使在我更新通知之后,如何保持服务的属性启动?
您应该ContextCompat.startForegroundService
只调用一次来启动ForegroundService
.
为了在ForegroundSerice
退出应用时更新通知而不被破坏,您可以在startForeground()
每次要更新前台服务通知时使用。
一个著名的例子就是将下载服务的下载进度更新为ProgressBar
.
重要的是:您需要确保在呼叫时使用相同的通知 IDstartForeground()
startForeground()
不会打电话onStartCommand
;如果这可能是可能的,那么我想这将是一个无限循环。
每当您想停止前台服务并提交正常通知(下载示例中的下载完成)时,您可以使用 提交正常通知notificationManager.notify()
,这将允许用户通过滑动来关闭通知。
更新:如聊天中所述
问题:前台服务停止后提交正常通知时;正常的通知也被驳回。
原因:这是因为您使用与前台服务相同的通知 ID,因此停止前台服务也会关闭正常通知。
解决方案:确保前台服务通知和停止前台服务时发出的正常通知的通知ID不同。
还要确保在下面调用以停止前台服务:
stopForeground(true);
stopSelf();
推荐阅读
- kotlin - 如何使用 Dagger2 和 Kotlin 对 AWS Lambda 处理程序进行单元测试?
- javascript - 如何从对象数组中返回匹配的属性值
- javascript - 如何仅在桌面上检测 Safari 浏览器?
- ios - 带有 Objective C 的 Firebase 推送通知在 ios 11.4.1 中不起作用
- javascript - JDZOOM jquery函数.getsize
- reactjs - Formik + yup 不显示错误
- java - 什么是 ServiceLoader,它是如何使用的?
- json - 在 PowerShell 2.0 中编辑 JSON 数据
- mongodb - 聚合 3 个集合后,mongoDB 计数不同的对象
- angular - 使用 Angular 6 在 index.html 中定义 base-href