【问题标题】:Android: catching application exitAndroid:捕获应用程序退出
【发布时间】:2011-12-30 22:43:54
【问题描述】:

我目前正在构建一个可以播放声音的应用。当用户启动声音时,我会使用以下代码显示状态栏通知:

notificationManager = (NotificationManager) activity.getSystemService(Activity.NOTIFICATION_SERVICE); Intent intent = new Intent(activity, MyActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(activity, 0, intent, 0); 通知 = 新通知(); notification.icon = android.R.drawable.stat_notify_sync; notification.flags |= Notification.FLAG_ONGOING_EVENT; 字符串标题 = activity.getString(R.string.notification_title); 字符串文本 = activity.getString(R.string.notification_text); notification.setLatestEventInfo(activity, title, text, pendingIntent);

这工作正常。稍后,如果用户停止所有声音,我使用 notificationManager.cancel 删除通知,再次,这工作正常。

我的问题是我想处理有人使用任务杀手应用程序的情况。如果有人使用一个来杀死我的应用程序,我希望从状态栏中删除通知图标。我知道很多用户喜欢使用这类应用,我不希望有人抱怨他们无法“关闭”我的应用!

到目前为止,我无法检测到应用程序何时将退出。我试过这个:

Thread.currentThread().setUncaughtExceptionHandler(新的 Thread.UncaughtExceptionHandler() { @覆盖 public void uncaughtException(线程线程,Throwable ex) { notificationManager.cancel(NOTIFICATION_ID); } });

还有这个:

Runtime.getRuntime().addShutdownHook(新线程() { @覆盖 公共无效运行() { notificationManager.cancel(NOTIFICATION_ID); } });

但这不起作用。当我的应用程序被杀死时,通知图标仍然存在。为了杀死我的应用程序,我一直在使用一个名为“Advanced Task Killer”的应用程序。我还通过在 DDMS 中终止我的进程来进行测试。

我注意到本机媒体播放器正在这样做。如果正在播放音乐并且您终止了音乐服务,则该图标将消失。

那么,有没有办法检测应用程序何时即将退出,以便我可以删除通知图标?或者如果我的应用程序被杀死,是否有办法自动删除通知图标?

谢谢!

【问题讨论】:

  • 您的应用程序只能在运行时管理通知。当一个应用程序在那里被杀死时,它不再执行任何东西,即使像application.onTerminate() 这样的东西也不会被调用。您必须找到一种方法来立即重新启动您的服务,然后管理您的通知或标记您的通知,以便系统在您的应用程序不再运行时将其删除。

标签: android


【解决方案1】:

通知栏中出现两种类型的图标:

  1. 通知,由应用程序或系统发送
  2. 前台服务

您使用的是第一种类型。它是应用程序(或系统)发送的通知,其目标是向用户传递一些信息。示例:新邮件到达、存储空间不足、我的帖子有新评论。 这些都是用户理论上想要检查的所有信息,它应该一直保持在那里,直到用户点击它以查看详细信息(如果有)或决定删除它们以删除所有剩余的通知。

我将从documentation 的引述开始谈论前台服务

前台服务是被认为是某种东西的服务 用户主动意识到,因此不是系统的候选者 内存不足时杀死。前台服务必须提供 状态栏的通知,位于“正在进行”下 标题,这意味着通知不能被驳回,除非 该服务已停止或从前台删除。

例如,播放来自服务的音乐的音乐播放器应该是 设置为在前台运行,因为用户明确知道 它的运作。状态栏中的通知可能会指示 当前歌曲并允许用户启动一个活动来与之交互 音乐播放器。

您在问题中提到的音乐应用就是这种情况。音乐应用程序内部的播放器部分被实现为前台服务。当用户选择一首歌曲并通过应用程序 UI 播放它时,服务会启动(图标出现在通知栏中)并开始播放歌曲,它可以独立于 UI 本身进行。当歌曲结束或用户停止播放时,图标会随着服务(应该)停止而消失。

要了解有关如何实现前台服务的更多信息,请参阅上面的链接(只需单击“文档”一词)

【讨论】:

  • 是的,似乎正确的方法是使用前台服务。我今天会试试这个。
  • 我终于可以尝试了,而且效果很好。这似乎是正确的方法。谢谢!
【解决方案2】:

您最好将其移至Service。在onBind() 中,您可以将Service 连接到主Activity,当应用程序被杀死时,您可以在onUnbindonDestroy 中删除Notification(在Service 中) .

【讨论】:

  • 您不需要添加和删除通知。如果创建前台服务,服务启动时服务图标会自动出现,服务停止时服务图标会自动消失。
【解决方案3】:

您唯一的希望是在 onPause() 中完成所有操作,即使如此,对于 ^really^ 需要保存的任何内容,我都在一种不会轻易被丢弃的后台线程中执行此操作(它在文档中只需阅读所有内容)并且我能想到的唯一“解决方法”是整个事情的运行方式是使用服务保存^当它运行^并检查非理智值^所有地方^并检查它们在 onResume() 中,这样如果您的应用程序确实被转储(仅通过从操作系统中的任务列表中删除指针),那么至少应用程序以半稳定状态返回给用户:

Dianne Hackborn, a Software Engineer who sits very near the exact center of everything Android.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多