活动生命周期图中的矛盾与生命周期的描述

时间:2015-03-06 16:29:34

标签: android android-activity android-lifecycle

我不清楚当某项活动被销毁时的情况是什么?#34;通过操作系统。

让我在这里的活动生命周期图中解释原因:http://developer.android.com/reference/android/app/Activity.html

有一个箭头直接从onStop()转到' App进程已被杀死'然后来自“应用程序”流程的箭头被杀死了#39;到OnCreate()。

因此,该图表明,如果由于内存限制等操作系统杀死活动,则不会调用onDestroy()。

然而,在生命周期的描述中," destroy"被使用了很多次。例如,此页面中的以下引用:http://developer.android.com/training/basics/activity-lifecycle/recreating.html

  

如果系统当前已停止,系统也可能会破坏您的活动   并且还没有在很长一段时间或前台活动中使用过   需要更多资源,因此系统必须关闭后台   恢复记忆的过程。

因此文档说该活动在图表中被销毁,箭头从onStop()转到onCreate()并绕过onDestroy()。这就是为什么我感到困惑,因为它显然是一个矛盾。

如果我有一个在onCreate()方法中创建一些对象的活动,并且我在onDestroy()中将它们设置为null,但是如果应用程序从onStop()移动到onCreate()然后赢了&#,则不会调用onDestroy() 39;我有内存泄漏,因为它们将在onCreate()中再次创建?

我无法在onStop()中将它们设置为null,因为如果生命周期从onStop()移动到onRestart()到onStart(),它们将为null。

因此,为了处理生命周期图中的所有路径,如何处理在活动中创建和销毁子对象的正确顺序?  在onCreate()中是否有必要仅在它们为null时才创建对象而不是其他?

1 个答案:

答案 0 :(得分:3)

  

因此,该图表明,如果由于内存限制等操作系统杀死活动,则不会调用onDestroy()。

有问题的箭头标有"优先级较高的应用程序需要内存"。因此,此图表显示the OS terminates the process未调用onDestroy(),因为具有较高优先级的应用程序需要内存。在其他情况下,Android会更轻柔地终止应用程序的处理,在这种情况下,Android会花时间为您的活动致电onDestroy()。在其他方案中也会调用onDestroy(),例如finish(),BACK按钮的默认行为,配置更改的默认行为等。

  

如果我有一个在onCreate()方法中创建一些对象的活动,并且我在onDestroy()中将它们设置为null,但是如果应用程序从onStop()移动到onCreate()然后赢了&#,则不会调用onDestroy() 39;我有内存泄漏,因为它们将在onCreate()中再次创建?

不,因为整个过程已经终止"如果应用从onStop()移动到onCreate()"。 Android does not destroy individual activities due to low memory conditions,尽管文件中有一些相反的陈述。

  

因此,为了处理生命周期图中的所有路径,如何处理在活动中创建和销毁子对象的正确顺序?

应该在onStop()之前或之前清理很多事情。具体而言,您应该考虑在onPause()onStop()进行清理时,您执行的任何操作可能会导致用户后悔安装您的应用,例如请求GPS修复。

对于那些你确定应该在onDestroy()中清理的东西,请执行此操作。 AFAIK,只有三种可能性:

  1. 您可以通过onDestroy()致电,并可以进行清理工作

  2. 您的流程已终止,在这种情况下,您的清理工作不再需要或可能

  3. 你因未处理的异常而崩溃,在这种情况下,Android无法保证再调用生命周期方法(这个故事的道德:使用优秀的异常处理程序)