Android源码阅读分析:Activity生命周期

Android源码阅读分析:Activity生命周期


(注:源代码为android-8.1)

0. 前言

  本篇文章简单介绍一下Activity的生命周期,以及各个生命周期方法执行的操作。


1. 生命周期总览

  Activity的生命周期如下图所示,主要由七个方法来界定。这七个方法除了onRestart方法外,另外六个可以分为三对来看待:onCreateonDestroy相对应,onStartonStop相对应以及onResumeonPause相对应。
Activity生命周期
  1. onCreateonDestroy:这一对方法之间是一个Activity的完整生命周期,表示从创建到销毁。
  2. onStartonStop:这一对方法之间是一个Activity的可见周期,处于这个周期内的Activity对于用户来说是可见的。当然,这里的可见可能只是部分可见,这意味有可能会被其他非全屏的Activity遮挡住。
  3. onResumeonPause:这一对方法之间是一个Activity的运行周期,在这个周期内,该Activity拥有焦点,可与用户进行交互。
  下面对各个生命周期函数的具体操作进行分析。


2. 回调方法的具体操作

2.1 onCreate方法

  该方法可以说是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`消息。

2.2 onStart方法

  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的值,来进行自动填充。

2.3 onResume方法

  当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的消息,随后恢复视图。

2.4 onPause方法

  当onPause方法被调用时,意味着该Activity准备进入后台。该方法通常可以用于保存一些持久化状态。此时也最好也停止动画等消耗CPU资源的东西,以及一些独占性的设备。

(frameworks/base/core/java/android/app/Activity.java)

@CallSuper
protected void onPause() {
    ...
    getApplication().dispatchActivityPaused(this);
    mCalled = true;
}

  该回调方法内部做的事情很简单,仅仅是向应用发布pause消息。

2.5 onStop方法

  当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));
        }
    }
}

2.6 onDestroy方法

  当该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消息。

2.7 onRestart方法

  onRestart只会在该ActivityonStop方法被调用后的情况下才会被调用。此时该Activity将被重新展示给用户,该方法被调用之后会调用onStartonResume方法。

(frameworks/base/core/java/android/app/Activity.java)

@CallSuper
protected void onRestart() {
    mCalled = true;
}

3. 总结

  本篇文章仅仅是对Activity生命周期以及生命周期方法的简单介绍,便于理解我们在使用Activity时,应该把一些操作放在什么地方来执行。

发布了21 篇原创文章 · 获赞 63 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/dongzhong1990/article/details/80451421