Android:捕捉应用程序退出

Android:捕捉应用程序退出,android,Android,我目前正在开发一个可以播放声音的应用程序。当用户启动声音时,我会显示带有以下代码的状态栏通知: notificationManager = (NotificationManager) activity.getSystemService(Activity.NOTIFICATION_SERVICE); Intent intent = new Intent(activity, MyActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_

我目前正在开发一个可以播放声音的应用程序。当用户启动声音时,我会显示带有以下代码的状态栏通知:

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=(notificationManager)activity.getSystemService(activity.NOTIFICATION\u服务); 意向意向=新意向(活动,MyActivity.class); intent.setFlags(intent.FLAG_ACTIVITY_CLEAR_TOP | intent.FLAG_ACTIVITY_SINGLE_TOP); PendingEvent PendingEvent=PendingEvent.getActivity(活动,0,意图,0); 通知=新通知(); notification.icon=android.R.drawable.stat\u notify\u sync; notification.flags |=notification.FLAG_持续事件; String title=activity.getString(R.String.notification\u title); String text=activity.getString(R.String.notification\u text); 通知。SetLateStevenInfo(活动、标题、文本、待定内容); 这很好用。稍后,如果用户停止所有声音,我将使用notificationManager.cancel删除通知,同样,这也可以正常工作

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

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

Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { notificationManager.cancel(NOTIFICATION_ID); } }); Thread.currentThread().setUncaughtExceptionHandler(新线程.UncaughtExceptionHandler()) { @凌驾 public void uncaughtException(线程,可丢弃的ex) { notificationManager.cancel(通知ID); } }); 还有:

Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { notificationManager.cancel(NOTIFICATION_ID); } }); Runtime.getRuntime().addShutdownHook(新线程() { @凌驾 公开募捐 { notificationManager.cancel(通知ID); } }); 但这是行不通的。当我的应用程序被终止时,通知图标仍然存在。为了杀死我的应用程序,我一直在使用一个名为“高级任务杀手”的应用程序。我还通过在DDMS中终止进程来进行测试

我注意到本地媒体播放器正在这样做。如果正在播放音乐,而您关闭了音乐服务,则图标将消失

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


谢谢

您唯一的希望是在onPause()中完成所有操作,即使是在那时,对于^real^需要保存的任何内容,我都是在一种不会轻易放弃的后台线程中完成的(在文档中,只需阅读所有内容)和唯一的“解决方法”我可以计算出整个程序的运行方式是在运行时使用服务执行保存操作,并在非正常值上执行null检查^everywhere^,然后在onResume()中进行检查,这样如果应用程序确实被转储(只需从操作系统的任务列表中删除指针)然后,至少应用程序以半稳定状态返回给用户:


您最好的选择是将其移动到一个新的位置。在
onBind()
中,您可以将
服务
连接到主
活动
,当应用程序被终止时,您可以在
onUnbind
onDestroy
(在
服务
中)中删除
通知

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

    我将从下面的引用开始讨论前台服务

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

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

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


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

    您的应用程序只能在运行时管理通知。当一个应用程序在那里被终止时,它不再执行任何东西,甚至像
    application.onTerminate()
    这样的东西也不会被调用。您必须找到一种方法立即重新启动服务,然后管理通知或标记通知,以便在应用程序不再运行时系统将其删除。是的,似乎正确的方法是使用前台服务。我今天要试试这个。我终于可以试试了,效果很好。这似乎是正确的方法。谢谢您不需要添加和删除n