Android:捕获应用程序退出

时间:2011-11-17 01:10:24

标签: android

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

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 = new Notification();
notification.icon = android.R.drawable.stat_notify_sync;
notification.flags |= Notification.FLAG_ONGOING_EVENT;

String title = activity.getString(R.string.notification_title);
String text = activity.getString(R.string.notification_text);

notification.setLatestEventInfo(activity, title, text, pendingIntent);

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

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

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

Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
  @Override
  public void uncaughtException(Thread thread, Throwable ex)
  {
    notificationManager.cancel(NOTIFICATION_ID);
  }
});

还有这个:

Runtime.getRuntime().addShutdownHook(new Thread()
{
  @Override
  public void run()
  {
     notificationManager.cancel(NOTIFICATION_ID);              
  }
});

但这不起作用。当我的应用程序被杀死时,通知图标仍然存在。要杀死我的应用程序,我一直在使用名为“高级任务杀手”的应用程序。我也通过在DDMS中杀死我的进程来进行测试。

我注意到原生媒体播放器正在这样做。如果正在播放音乐并且你杀了音乐服务,图标就会消失。

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

谢谢!

3 个答案:

答案 0 :(得分:2)

您最好的选择是将其移至Service。在onBind()中,您可以将Service与主Activity相关联,当应用被杀时,您可以删除Notification中的onUnbindonDestroy(在Service)。

答案 1 :(得分:2)

通知栏中显示两种类型的图标:

  1. 通知,由应用程序或系统发送
  2. 前台服务
  3. 您使用的是第一种类型。它是应用程序(或系统)发送的通知,其目标是向用户提供一些信息。示例:新邮件到达,低存储空间,我的帖子上的新评论。 这些是用户理论上想要检查的所有信息,它应该保持在那里,直到用户点击它以查看详细信息(如果有的话)或决定删除它们删除所有留下的通知。

    我将从documentation

    开始讨论前台服务
      

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

         

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

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

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

答案 2 :(得分:0)

你唯一的希望就是在onPause()中做所有事情,甚至那时候确实^需要保存的任何东西我都是在一种背景线程中这样做,不会轻易被抛弃(它在文档中)只读全部)和唯一的“解决方法”,我可以计算整个事情的运行方式是在运行^时使用服务保存^并在非理智值上检查空值^到处^并检查它们在onResume()中,如果你的应用程序确实被转储(只是从os中的任务列表中删除指针),那么至少app会以半稳定的状态返回给用户:

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