Android应用程序在死亡时不会调用“onDestroy()”(ICS)

我正在开发一个使用蓝牙通信(使用propetary协议)的android应用程序,我需要赶上应用程序被杀害的时刻。

我想使用“onDestroy()”方法,但不会在每次应用程序被终止时调用。 我注意到,当我按下后退button时,它被调用,并且有时,当我从任务pipe理器中杀死应用程序。

问题是:如何才能捕捉应用程序被杀之前的一刻?

这是我尝试使用的代码:

@Override public void onDestroy() { sendMessage(msg); Log.d("SampleApp", "destroy"); super.onDestroy(); } @Override public void finish(){ sendMessage(msg); Log.d("SampleApp", "finish"); super.finish(); } 

不幸的是,finish()永远不会被调用,并且每次我从任务pipe理器closures应用程序时都不会调用onDestroy。

我该如何处理?

Solutions Collecting From Web of "Android应用程序在死亡时不会调用“onDestroy()”(ICS)"

正如在这里的文档所述,不能保证onDestroy()永远不会被调用。 相反,当应用程序移动到后台时,使用onPause()来执行你想要做的事情,并且只在onDestroy()中保留你想在应用程序被终止时运行的代码。

编辑:

从你的评论看来,当你的应用程序进入后台的时候,你似乎想运行一些代码,但是如果因为你启动了一个intent而进入了后台,那么就不会这样做。 AFAIK,Android中没有方法默认处理这个,但是你可以使用像这样的东西:

有一个布尔如:

 boolean usedIntent = false; 

在使用意图之前,将布尔值设置为true。 现在在你的onPause()中,把这个intent case的代码移动到这个if块中:

 if(usedIntent) { //Your code } 

最后,在你的onResume()中,再次设置boolean为false,这样它就可以处理你的应用程序被非意图移动到后台的方式。

如果通过外部手段终止的进程(即因内存原因而死亡,或者用户强制停止应用程序),您的应用程序将不会收到任何额外的callback。 当您的应用程序进入应用程序清理的背景时,您将不得不使用您收到的callback。

finish()只有当用户按下你的Activity中的BACKbutton时才被系统调用,尽pipe它通常被应用程序直接调用来离开一个Activity并返回到前一个。 这在技术上不是生命周期callback。

onDestroy()仅在调用finish() onDestroy()时才被调用,因此主要只在用户点击BACKbutton时调用。 当用户点击HOMEbutton时,前景活动只经过onPause()onStop()

这意味着,Android不会提供太多的反馈意见来区分用户在家,而不是移动到另一个活动(从您的应用程序或任何其他); 活动本身只是知道它不再处于前台。 Android应用程序更像是一个松散的活动集合,而不是一个紧密集成的单一概念(就像您可能在其他平台上使用的一样),所以没有真正的系统callback来知道您的应用程序整体何时被提出或移动落后。

最后,如果需要了解应用程序中的ANY Activity是否在前台,但是根据您的需要,可能还有其他方法可以更加友好地实现这一目标,所以我会敦促您重新考虑您的应用程序体系结构。 一种select是在你的应用程序中实现一个绑定的Service ,每个Activity绑定到活动(即onStart()onStop() )之间。 这个提供给你的是能够利用绑定Service只在客户端绑定的情况下才存在的事实,所以你可以监视服务的onCreate()onDestroy()方法来知道当前的前台任务是什么时候不是你的应用程序的一部分

您也可能会发现这篇由Dianne Hackborn编写的文章更有趣,涵盖了Android架构以及Google如何使用它。

我刚刚解决了类似的问题。

如果应用程序通过从最近的应用程序列表中滑动来终止服务 ,则可以执行以下操作。

在你的Manifest文件中,保持标志stopWithTasktrue 。 喜欢:

 <service android:name="com.myapp.MyService" android:stopWithTask="true" /> 

但正如你所说的,你想取消注册听众,并停止通知等,我会build议这种做法:

  1. 在你的Manifest文件中,保持标志stopWithTaskfalse的服务。 喜欢:

     <service android:name="com.myapp.MyService" android:stopWithTask="false" /> 
  2. 现在在你的MyService服务中,覆盖方法onTaskRemoved 。 (只有当stopWithTask设置为false才会触发这个function)。

     public void onTaskRemoved(Intent rootIntent) { //unregister listeners //do any other cleanup if required //stop service stopSelf(); } 

请参阅我的问题了解更多细节,也包含其他代码部分。

  1. 开始像下面的服务

startService(new Intent(this,MyService.class));

希望这可以帮助。