Android应用在被杀时不会调用“onDestroy()”(ICS)

时间:2012-07-13 15:45:35

标签: android android-4.0-ice-cream-sandwich ondestroy

我正在开发一个使用蓝牙通信的Android应用程序(使用一个propetary协议),我需要抓住应用程序被杀的那一刻。

我想使用“onDestroy()”方法,但每次应用程序被杀死时都不会调用它。 我注意到当我按下后退按钮时会调用它,有时只有当我从任务管理器中删除应用程序时才会调用它。

问题是:我怎样才能抓住应用程序被杀之前的那一刻?

以下是我尝试使用的代码:

@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()并且不会调用onDestroy。

我该如何处理?

3 个答案:

答案 0 :(得分:15)

如文档here中所述,无法保证将永远调用onDestroy()。相反,只要应用程序进入后台,就可以使用onPause()执行您想要执行的操作,并且只有在您的应用程序被杀死时才能在onDestroy()中保留该代码。

编辑:

根据您的评论,您似乎希望在应用进入后台时运行一些代码,但是如果因为您启动了意图而进入后台则不会。 AFAIK,Android中没有处理此方法的方法,但您可以使用以下内容:

有一个类似的布尔值:

boolean usedIntent = false;

现在在使用intent之前,将boolean设置为true。现在在onPause()中,将intent case的代码移动到像这样的if块中:

if(usedIntent)
{
//Your code
}

最后,在你的onResume()中,再次将布尔值设置为false,以便它可以通过非意图的方式处理你的应用程序被移动到后台。

答案 1 :(得分:14)

如果您的应用程序通过外部方式终止(即因内存原因而被终止或用户强制停止应用程序),您的应用程序将不会收到任何其他回调。当应用程序进入后台进行应用程序清理时,您将不得不处理回调。

finish()仅在用户按下Activity中的BACK按钮时由系统调用,尽管应用程序通常会直接调用它来保留Activity并返回上一个Activity。从技术上讲,这不是生命周期回调。

onDestroy()仅在调用finish()时调用Activity,因此主要仅在用户点击BACK按钮时才会调用。当用户点击HOME按钮时,前景活动仅通过onPause()onStop()

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

最终,我建议您重新考虑您的应用程序架构,如果它依赖于您的应用程序中的任何活动是否在前台的知识,但根据您的需要,可能还有其他方式更友好的框架来完成这个。一种选择是在应用程序内部实现绑定Service,每个Activity在活动时绑定(即onStart()onStop()之间)。这为您提供的是能够利用绑定Service仅在客户端绑定的情况下生存的事实,因此您可以监控onCreate()onDestroy()方法服务以了解当前前台任务何时不属于您的应用程序。

您可能还会发现Dianne Hackborn编写的this article有趣地介绍了Android架构以及Google认为应该如何使用它。

答案 2 :(得分:1)

我刚解决了类似的问题。

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

在您的清单文件中,将stopWithTask标记为true作为服务。像:

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

但正如你所说,你想取消注册听众并停止通知等,我建议采用这种方法:

  1. 在您的清单文件中,将stopWithTask标记为false作为服务。像:

    <service
        android:name="com.myapp.MyService"
        android:stopWithTask="false" />
    
  2. 现在在您的MyService服务中,覆盖方法onTaskRemoved。 (仅当stopWithTask设置为false时才会触发。

    public void onTaskRemoved(Intent rootIntent) {
    
        //unregister listeners
        //do any other cleanup if required
    
        //stop service
        stopSelf();  
    }
    
  3. 有关详细信息,请参阅this question,其中包含其他部分代码。

    1. 启动如下服务
    2.   

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

      希望这有帮助。