我们可以做些什么来确保调用onDestroy()?

时间:2018-04-01 16:47:54

标签: android activity-lifecycle android-ondestroy

我的活动被销毁后我应该调用一行代码,所以我覆盖了onDestroy()方法,我在里面调用它。像这样:

   @override
   public void onDestroy(){

     //my code here

     super.onDestroy()  

   }

现在我注意到,当我的活动结束时,并不总是执行这行代码。

我读到了这个,有些人说不依赖于onDestroy()方法来打电话。

我的问题是我需要调用onDestroy()中的代码,我希望它始终有效。有什么想法吗?如果我们不能依赖它来执行,那么为什么onDestroy()首先被发现?

4 个答案:

答案 0 :(得分:1)

依靠onDestroy()进行清理工作并不是一个好主意。最好在onPause()onStop()中执行这些操作。这些是当您的活动不在视图时系统调用的回调方法。

答案 1 :(得分:0)

  

现在我注意到,当我的活动结束时,并不总是执行这行代码。

或者:

  • onDestroy()被调用,或

  • 您因未处理的异常而崩溃,或

  • 您的流程已终止(例如,用户已撤消设置的运行时权限,Android需要RAM匆忙)

  

我读到了这个,有些人说不依赖于onDestroy()方法来调用它。

正确。假设您的应用继续正常运行,onDestroy()用于清理事物。但是,如果您的应用不再正常运行(您已崩溃)或您的应用已消失(流程已终止),则onDestroy()无效。

  

我需要调用onDestroy()中的代码,我希望它始终有效。有什么想法吗?

您需要重新考虑这两个要求,因为它们不可能都是真的。在onStart()初始化并在onStop()中清理,或者可能不会调用您的清理代码这一事实。即使onStop()方案也未得到完全保证 - 在多窗口环境中,用户可以在您的应用仍然可见时撤消设置中的运行时权限 - 但我们会进入相当不太可能的情况。

答案 2 :(得分:0)

我们无法保证onPause会被调用,但我依靠Activity通过调用if( isFinishing() ) // activity is about to finish检查onDestroy是否正在完成但是这可能不会好好工作。

我重新考虑过我的逻辑,完全不依赖boolean isFinishing ()

{{1}}
  

检查此活动是否正在完成,   要么是因为你在上面调用了finish(),要么就是其他人要求的   它完成了。这通常用于onPause()来确定是否   活动只是暂停或完全结束。

https://developer.android.com/reference/android/app/Activity.html#isFinishing%28%29

答案 3 :(得分:0)

这些是系统调用该方法的方法,这些方法在程序员显式调用时将崩溃...