如何在Android应用程序(活动或服务)被杀死时删除所有通知?

时间:2014-03-05 21:58:00

标签: android service notifications

我有一个应用程序,其活动和目标服务在后台运行。

还有一个通知显示进度条,其中包含后台进程的进度(它从服务器下载了大量文件)。

活动会显示下载进度(在下载这些资源之前,用户无法有意义地使用该应用程序)。关闭此活动后,将显示带有进度条的通知。

我的问题:当应用程序被“任务管理器”(可通过​​Android 4.0上的右键,具有两个矩形的那个)访问时,通知仍然存在。但它基本上是一个僵尸,因为用于更新它的服务已经死了。

以不同的方式:当我的申请被杀时,如何删除(或所有)通知?

5 个答案:

答案 0 :(得分:22)

@see public void onTaskRemoved(Intent rootIntent)。 如果服务当前正在运行且用户已删除来自服务应用程序的任务,则调用此方法。如果您设置了ServiceInfo.FLAG_STOP_WITH_TASK标志,那么您将不会收到此回调;相反,该服务将被停止。

您可以删除应用已使用cancelAll()创建的所有通知:

NotificationManager nManager = ((NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE));
nManager.cancelAll();

根据API文档,这将

  

取消之前显示的所有通知。

cancel(int id)的做法相同:

  

取消之前显示的通知。如果它是瞬态的,视图将被隐藏。如果它是持久的,它将从状态栏中删除。

答案 1 :(得分:3)

似乎

onTaskRemoved

当用户杀死应用程序任务时(通过在“任务管理器”中刷出应用程序),可以调用服务DOES。我可以从此处删除通知。

答案 2 :(得分:0)

您无法跟踪应用程序是否从活动或应用程序类中被杀死。

我在以下链接中找到了解决方案: Cancel notification on remove application from multitask panel

请试试这个。

答案 3 :(得分:0)

在通知构建器中使用setTimeoutAfter,然后使用递归调用启动协程以在通知取消之前刷新该通知。

这样,如果您的服务被终止(不会通过onDestroy或接收任何其他回调来触发通知的取消),则通知只会为您超时。而且,启动+绑定服务的唯一方法是在操作系统空闲后杀死该应用程序。

使用前台服务还意味着您的正常应用程序生命周期将不会受到限制。正确无误,但可行。

请参见方法buildNotificationnotify,以及https://github.com/05nelsonm/TorOnionProxyLibrary-Android/blob/master/topl-service/src/main/java/io/matthewnelson/topl_service/notification/ServiceNotification.kt中的launchRefreshNotificationJob

答案 4 :(得分:-2)

你试过onStop吗?它对我有用。我在onStop中调用了cancelAll()。它会关闭从任务管理器中删除应用程序的所有通知。

注意:但是当您的应用程序进入后台时,它也会删除所有通知。在这种情况下,您可以使用后台进程重新调用这些通知。

@Override public void onStop (){
    super.onStop();
    cancelAllNotification(getApplicationContext());
}

public static void cancelAllNotification(Context ctx) {
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager nMgr = (NotificationManager) ctx.getSystemService(ns);
    nMgr.cancelAll();
}