从onDestroy()调用的stopForeground(true)不会删除通知

时间:2017-04-28 00:19:36

标签: android

我想在销毁前台服务后删除通知。我尝试从stopForeground(true)onDestroy()致电unbind()。尽管调用了onUnbind()和onDestroy()(我可以从日志中看到它),但仍然存在通知。我通过从我的活动中调用unbindService(playerConnection)stopService(this)来停止服务。

为什么它不按这种方式工作?有关如何在销毁服务时删除通知的任何想法?

更新:在播放通知时我注意到了一件有趣的事情。我在服务中做了一个特殊的方法:

fun hideNotification() {
    stopForeground(true)
    Log.d("PlayerService", "hideNotification")
}

按下按钮时,我从我的活动中调用它。它删除了通知。但是,从活动的onStop()或服务的onUnbind()或onDestroy()调用相同的函数并不是。我无法理解这些情况之间的区别。

3 个答案:

答案 0 :(得分:0)

尝试停止前台服务并删除所有通知时,我遇到了同样的问题。

作为解决方法,我删除通知频道,并在需要时重新创建。

解决此问题的方法如下:

  1. 在onStartCommand()中(或该服务中的其他位置)从其中停止该服务。
  2. StopForeground(true)
  3. 删除通知通道(实际上是清除所有通知的通道)。

示例:

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;用于删除通知。

希望这会对你有所帮助。