(注:源代码为android-8.1)
本篇文章简单介绍一下Activity
的生命周期,以及各个生命周期方法执行的操作。
Activity
的生命周期如下图所示,主要由七个方法来界定。这七个方法除了onRestart
方法外,另外六个可以分为三对来看待:onCreate
和onDestroy
相对应,onStart
和onStop
相对应以及onResume
和onPause
相对应。
1. onCreate
和onDestroy
:这一对方法之间是一个Activity
的完整生命周期,表示从创建到销毁。
2. onStart
和onStop
:这一对方法之间是一个Activity
的可见周期,处于这个周期内的Activity
对于用户来说是可见的。当然,这里的可见可能只是部分可见,这意味有可能会被其他非全屏的Activity
遮挡住。
3. onResume
和onPause
:这一对方法之间是一个Activity
的运行周期,在这个周期内,该Activity
拥有焦点,可与用户进行交互。
下面对各个生命周期函数的具体操作进行分析。
该方法可以说是Android开发者见到最多的方法之一了。几乎所有的自定义Activity
都要重写该方法。
那么我们看一下当onCreate
方法被调用后,发生了什么。
(frameworks/base/core/java/android/app/Activity.java)
@MainThread
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
...
if (savedInstanceState != null) {
// 当保存的状态数据不为空时,判断是否利用该保存状态恢复
mAutoFillResetNeeded = savedInstanceState.getBoolean(AUTOFILL_RESET_NEEDED, false);
mLastAutofillId = savedInstanceState.getInt(LAST_AUTOFILL_ID, View.LAST_APP_AUTOFILL_ID);
if (mAutoFillResetNeeded) {
getAutofillManager().onCreate(savedInstanceState);
}
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, mLastNonConfigurationInstances != null ? mLastNonConfigurationInstances.fragments : null);
}
// 将create消息发布出去
mFragments.dispatchCreate();
getApplication().dispatchActivityCreated(this, savedInstanceState);
...
}
onCreate
方法比较简单,其作用主要就是两个:使用savedInstanceState
创建`,发布
create`消息。
onStart
方法在Activity
生命周期中,表示该Activity
进入可见周期。
(frameworks/base/core/java/android/app/Activity.java)
@CallSuper
protected void onStart() {
...
mFragments.doLoaderStart();
getApplication().dispatchActivityStarted(this);
if (mAutoFillResetNeeded) {
AutofillManager afm = getAutofillManager();
if (afm != null) {
afm.onVisibleForAutofill();
}
}
}
onStart
方法首先发布start
消息,然后根据onCreate
方法确定的mAutoFillResetNeeded
的值,来进行自动填充。
当onResume
方法被调用时,表示当前Activity
进入可以与用户交互的生命周期。在这里可以做一些动画效果,或者打开独占性的设备,比如相机等等。
(frameworks/base/core/java/android/app/Activity.java)
@CallSuper
protected void onResume() {
...
getApplication().dispatchActivityResumed(this);
mActivityTransitionState.onResume(this, isTopOfTask());
mCalled = true;
}
onResume
方法里面首先想应用发送了resume
的消息,随后恢复视图。
当onPause
方法被调用时,意味着该Activity
准备进入后台。该方法通常可以用于保存一些持久化状态。此时也最好也停止动画等消耗CPU资源的东西,以及一些独占性的设备。
(frameworks/base/core/java/android/app/Activity.java)
@CallSuper
protected void onPause() {
...
getApplication().dispatchActivityPaused(this);
mCalled = true;
}
该回调方法内部做的事情很简单,仅仅是向应用发布pause
消息。
当onStop
方法被调用时,该Activity
不再处于可见状态。
(frameworks/base/core/java/android/app/Activity.java)
@CallSuper
protected void onStop() {
...
if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(false);
mActivityTransitionState.onStop();
getApplication().dispatchActivityStopped(this);
mTranslucentCallback = null;
mCalled = true;
if (isFinishing()) {
if (mAutoFillResetNeeded) {
getAutofillManager().commit();
} else if (mIntent != null && mIntent.hasExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN)) {
getAutofillManager().onPendingSaveUi(AutofillManager.PENDING_UI_OPERATION_CANCEL, mIntent.getIBinderExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN));
}
}
}
当该Activity
被通过finish
方法结束或者因空间不足而被系统销毁时,会调用该方法。可以根据isFinishing
方法来区别这两种情况。
不要在该方法内保存数据,应当放在onPause
方法或者onSaveInstanceState
方法内。该方法内通常用于释放资源。
还有一种情况,系统会杀掉该Activity
的宿主进程,而不调用onDestroy
方法,所以不要在该方法内做一些线程被杀死后仍然会保留的事情。
(frameworks/base/core/java/android/app/Activity.java)
@CallSuper
protected void onDestroy() {
...
// 释放所有Dialog
if (mManagedDialogs != null) {
final int numDialogs = mManagedDialogs.size();
for (int i = 0; i < numDialogs; i++) {
final ManagedDialog md = mManagedDialogs.valueAt(i);
if (md.mDialog.isShowing()) {
md.mDialog.dismiss();
}
}
mManagedDialogs = null;
}
// 关闭所有被管理的cursor
synchronized (mManagedCursors) {
int numCursors = mManagedCursors.size();
for (int i = 0; i < numCursors; i++) {
ManagedCursor c = mManagedCursors.get(i);
if (c != null) {
c.mCursor.close();
}
}
mManagedCursors.clear();
}
// 关闭所有搜索对话
if (mSearchManager != null) {
mSearchManager.stopSearch();
}
if (mActionBar != null) {
mActionBar.onDestroy();
}
getApplication().dispatchActivityDestroyed(this);
}
onDestroy
方法主要是对Activity
做一些最后的清理,包括关闭Dialog
、关闭光标、关闭搜索对话、销毁ActionBar
等等。清理执行完毕后,在向应用发布destroy
消息。
onRestart
只会在该Activity
的onStop
方法被调用后的情况下才会被调用。此时该Activity
将被重新展示给用户,该方法被调用之后会调用onStart
和onResume
方法。
(frameworks/base/core/java/android/app/Activity.java)
@CallSuper
protected void onRestart() {
mCalled = true;
}
本篇文章仅仅是对Activity
生命周期以及生命周期方法的简单介绍,便于理解我们在使用Activity
时,应该把一些操作放在什么地方来执行。