首先让我们了解一下您引用的文档是怎么回事。
以下命令显示git blame
的输出Activity.java
AOSP 中的文件:
$ cd $AOSP/frameworks/base
$ git blame ./core/java/android/app/Activity.java
输出的相关部分:
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 363) * <p>Note the "Killable" column in the above table -- for those methods that
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 364) * are marked as being killable, after that method returns the process hosting the
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 365) * activity may killed by the system <em>at any time</em> without another line
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 366) * of its code being executed. Because of this, you should use the
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 367) * {@link #onPause} method to write any persistent data (such as user edits)
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 368) * to storage. In addition, the method
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 369) * {@link #onSaveInstanceState(Bundle)} is called before placing the activity
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 370) * in such a background state, allowing you to save away any dynamic instance
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 371) * state in your activity into the given Bundle, to be later received in
550116576 (RoboErik 2014-07-09 15:05:53 -0700 372) * {@link #onCreate} if the activity needs to be re-created.
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 373) * See the <a href="#ProcessLifecycle">Process Lifecycle</a>
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 374) * section for more information on how the lifecycle of a process is tied
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 375) * to the activities it is hosting. Note that it is important to save
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 376) * persistent data in {@link #onPause} instead of {@link #onSaveInstanceState}
5c40f3fcc (Daisuke Miyakawa 2011-02-15 13:24:36 -0800 377) * because the latter is not part of the lifecycle callbacks, so will not
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 378) * be called in every situation as described in its documentation.</p>
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 379) *
0aae2d4e0 (Dianne Hackborn 2010-12-07 23:51:29 -0800 380) * <p class="note">Be aware that these semantics will change slightly between
0aae2d4e0 (Dianne Hackborn 2010-12-07 23:51:29 -0800 381) * applications targeting platforms starting with {@link android.os.Build.VERSION_CODES#HONEYCOMB}
0aae2d4e0 (Dianne Hackborn 2010-12-07 23:51:29 -0800 382) * vs. those targeting prior platforms. Starting with Honeycomb, an application
0aae2d4e0 (Dianne Hackborn 2010-12-07 23:51:29 -0800 383) * is not in the killable state until its {@link #onStop} has returned. This
0aae2d4e0 (Dianne Hackborn 2010-12-07 23:51:29 -0800 384) * impacts when {@link #onSaveInstanceState(Bundle)} may be called (it may be
0aae2d4e0 (Dianne Hackborn 2010-12-07 23:51:29 -0800 385) * safely called after {@link #onPause()} and allows and application to safely
0aae2d4e0 (Dianne Hackborn 2010-12-07 23:51:29 -0800 386) * wait until {@link #onStop()} to save persistent state.</p>
0aae2d4e0 (Dianne Hackborn 2010-12-07 23:51:29 -0800 387) *
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 388) * <p>For those methods that are not marked as being killable, the activity's
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 389) * process will not be killed by the system starting from the time the method
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 390) * is called and continuing after it returns. Thus an activity is in the killable
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 391) * state, for example, between after <code>onPause()</code> to the start of
9066cfe98 (The Android Open Source Project 2009-03-03 19:31:44 -0800 392) * <code>onResume()</code>.</p>
请注意,讨论蜂巢后行为的段落是由 Dianne Hackborn 在 2010 年 12 月 7 日添加的,而所附段落可追溯到 2009 年 3 月 3 日。
它告诉我们的是 Dianne 添加了新段落而没有更新 javadoc 的其余部分,因此存在矛盾。不幸的是,这种情况在 Android 中并不罕见。
对于您的问题:
1) 在后 Honeycomb 版本的 Android 上onResume()
and onStop()
保证被调用(正如 Dianne Hackborn 在 Activity 的 javadoc 中补充的那样)。
2) 仅适用于蜂巢之前onPause()
保证被调用(如早期版本的 Activity 的 javadoc 中所述)
3,4,5) onDestroy()
仅当托管整个应用程序的进程被终止时才不会被调用。当进程被终止时,分配给它的所有资源都将被释放,因此在这种情况下不存在内存泄漏的风险。
重要的提示:自从释放资源以来onDestroy()
不会导致内存泄漏,将所有“释放”代码放在那里可能看起来是个好主意。然而,它很少是最佳方法。为什么?参见下文。
When Activity
进入后台,它被停止,但不会被破坏(通常)。Activity
可以在相当长的时间内保持这种“停止”状态,并且如果用户返回到应用程序,则将再次启动。如果您释放资源onDestroy()
,默认情况下不会调用Activity
进入后台,Activity
将在停止状态下保留这些资源,从而导致您的应用程序在后台状态下消耗更多的资源。
当 Android 内存不足时,它会开始终止进程以释放它们消耗的内存。选择要终止的进程时要考虑的最重要的考虑因素之一是它们的资源消耗。因此,如果您的应用程序在后台停止状态下保留资源,那么它将有更高的机会被 Android 杀死。
此外,我们开发人员必须确保为用户制作最好的应用程序。在后台消耗大量用户手机资源和电池的应用程序不是一个好的应用程序。用户会知道这一点!
因此,我强烈建议释放所有资源onStop()
方法。我通常不会覆盖onDestroy()
中的方法Activities
and Fragments
at all.
推论:正如 @Juan 在他的评论中指出的,上述重要注释有一个同样重要但不那么明显的推论:onStart()
应该是分配资源的唯一方法。无论你对“资源”的定义是什么,两者都不是onCreate()
nor onResume()
应该分配这些资源。