首页 > 解决方案 > 触发更新后应用程序销毁后通知被解除

问题描述

android 文档指出,要启动服务,onStartCommand必须实现。当我创建service, 并使用 启动服务ContextCompat.startForegroundService(...)时,它的onStartCommand方法被执行,此时即使我退出应用程序,服务也不会停止(如预期的那样)。

但是,后来当我通过更改显示的文本来更新通知时,我使用了该notificationManager.notify()方法,现在当我退出应用程序时,服务会自动停止。我想知道我们是否应该在每次通知更新时强制调用 onStartCommand,不知何故(比如我们应该用 更新通知ContextCompat.startForegroundService吗?我已经从api level 19to测试过api level 27了,行为都是一样的。我怎样才能将服务的属性维护为started即使在我更新通知之后?

标签: javaandroidservice

解决方案


我想知道我们是否应该onStartCommand在每次通知更新时强制调用,

不,您不会被迫调用onStartCommand每个通知更新

不知何故(比如我们应该用 更新通知ContextCompat.startForegroundService吗?我已经从 API 级别 19 测试到 API 级别 27 并且行为都是一样的。即使在我更新通知之后,如何保持服务的属性启动?

您应该ContextCompat.startForegroundService只调用一次来启动ForegroundService.

为了在ForegroundSerice退出应用时更新通知而不被破坏,您可以在startForeground()每次要更新前台服务通知时使用。

一个著名的例子就是将下载服务的下载进度更新为ProgressBar.

重要的是:您需要确保在呼叫时使用相同的通知 IDstartForeground()

startForeground()不会打电话onStartCommand;如果这可能是可能的,那么我想这将是一个无限循环。

每当您想停止前台服务并提交正常通知(下载示例中的下载完成)时,您可以使用 提交正常通知notificationManager.notify(),这将允许用户通过滑动来关闭通知。

更新:如聊天中所述

问题:前台服务停止后提交正常通知时;正常的通知也被驳回。

原因:这是因为您使用与前台服务相同的通知 ID,因此停止前台服务也会关闭正常通知。

解决方案:确保前台服务通知和停止前台服务时发出的正常通知的通知ID不同。

还要确保在下面调用以停止前台服务:

stopForeground(true);
stopSelf();

推荐阅读