从后台关闭应用程序后取消通知

6
我有一个活动,它会在通知栏上显示通知。如果用户按下主页按钮转到后台,我会保留通知(这是我需要的),但是当用户关闭应用程序时,我需要取消通知,这就是我的问题。
我尝试在onDestroy中取消通知,但它没有被触发。
我尝试将setOngoing设置为true以保持通知。
我该怎么处理呢?每次用户进入后台然后关闭应用程序时,我都需要从通知栏中删除通知,但如果用户将应用程序保持在后台,则需要通知。

正如此答案所详细说明的那样,请尝试一下 https://dev59.com/12gu5IYBdhLWcg3wP0tm#11473952 - kabuto178
5个回答

2
你创建通知时,会得到一个通知ID,对吧?
然后你只需要使用该ID来取消通知。
例如:
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(4);

当用户退出应用或在您的活动上调用finish()时,将触发onDestroy事件。


2
onDestroy不是每次都会被调用。它取决于Android系统是否调用它。我正在使用这个确切的代码来在调用onDestroy时取消通知,但并不总是被调用。我还能做什么? - user2494863
1
为什么不使用 onPause - kabuto178
每当您在活动上调用finish时,都会调用onDestroy。 - tyczj
2
@kabuto178 onPause方法在用户离开活动时被调用,无论是按下主页按钮还是退出应用程序。因此,如果他在onPause中取消通知,则当用户按下主页按钮时它将被取消,这不是他想要发生的事情。 - tyczj
1
这不是一个合适的退出方式吧?当我这样做时,所有来自该活动的线程都停止了。没有任何方法可以检查这种行为吗? - user2494863
显示剩余6条评论

1
我创建了一个永久运行的异步任务,现在当我将应用程序从最近列表中移除时,onDestroy会被调用。

你在异步任务中写了什么?能发一下吗? - saleh sereshki
好的,让我们看看代码,这可能会很有趣.. :) - DragonFire
永远运行 :O :O :O 这就是Android团队推出所有这些Doze模式、服务限制等的原因。 - Alex

0
你需要创建一个服务,然后覆盖这个方法;并且为了确保相同的拷贝到onCreate方法中,因为当该服务关闭时,它可能会重新启动。
@Override 
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.cancelAll();
}

由于后台服务的限制,此功能将不再适用于API级别>= 26 - https://developer.android.com/about/versions/oreo/background#services。此解决方案已不再可行,系统会在一段时间后停止此服务(因此会错过onTaskRemoved事件)。 - Vadim Kotov

0

如果我们在onTaskRemoved()方法中取消通知,可以取消通知,只需在该方法中执行mNotificationManager.cancel(NOTIFICATION_ID),因为onDestroy方法并不总是被调用。这对我来说很有效。


0

解决这个问题的方法可能听起来有些奇怪,但它对我有效,并且适用于所有版本的Android。如果您的应用程序中有任何光标加载器,则每次关闭应用程序时都会调用onLoaderReset方法。

@Override
public void onLoaderReset(Loader<Cursor> loader) {

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.cancelAll();

    myRecyclerAdapter.swapCursor(null);

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接