我想在销毁前台服务后删除通知。我尝试从stopForeground(true)
和onDestroy()
致电unbind()
。尽管调用了onUnbind()和onDestroy()(我可以从日志中看到它),但仍然存在通知。我通过从我的活动中调用unbindService(playerConnection)
和stopService(this)
来停止服务。
为什么它不按这种方式工作?有关如何在销毁服务时删除通知的任何想法?
更新:在播放通知时我注意到了一件有趣的事情。我在服务中做了一个特殊的方法:
fun hideNotification() {
stopForeground(true)
Log.d("PlayerService", "hideNotification")
}
按下按钮时,我从我的活动中调用它。它删除了通知。但是,从活动的onStop()或服务的onUnbind()或onDestroy()调用相同的函数并不是。我无法理解这些情况之间的区别。
答案 0 :(得分:0)
尝试停止前台服务并删除所有通知时,我遇到了同样的问题。
作为解决方法,我删除通知频道,并在需要时重新创建。
解决此问题的方法如下:
示例:
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
var stopService : Boolean # Service stop condition
var isRunning : Boolean # stopSelf() raise exception if service is not running.
if (stopService}){
stopForeground(true)
notificationManager.deleteNotificationChannel("channel_id");
if (isRunning){
Log.d(TAG, "Service is running, stopping.")
stopSelf()
}else
Log.d(TAG, "Service is not running, no need to stop.")
return START_NOT_STICKY
}
一些参考文献:
How to remove old notification channels?
What is the proper way to stop a service running as foreground
答案 1 :(得分:0)
在两个服务之间调试数小时后,一个删除了通知,另一个没有,我发现它们之间的唯一区别是其中一个将 android 属性导出为 false。
<service
...
...
android:exported="false">
我忽略了设置导出为 false 使我能够删除通知的原因,但我想分享这个解决方案
答案 2 :(得分:-4)
要删除通知,您必须使用notificationManager.cancel(ID);在onDestry()中或当您想要删除通知时。
ID:用于显示通知的ID,需要在cancel()
中给出相同的ID例: ID = 210;
notificationManager.notify(ID,notification); ==&GT;用于显示通知。
notificationManager.cancel(ID)===&gt;用于删除通知。
希望这会对你有所帮助。