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


(注:源代码为android-8.1)

0. 前言

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


1. 生命周期总览

  Activity的生命周期如下图所示,主要由七个方法来界定。这七个方法除了onRestart方法外,另外六个可以分为三对来看待:onCreateonDestroy相对应,onStartonStop相对应以及onResumeonPause相对应。

  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@CallSuperprotected 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)@CallSuperprotected 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)@CallSuperprotected 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)@CallSuperprotected void onPause() {    ...    getApplication().dispatchActivityPaused(this);    mCalled = true;}

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

2.5 onStop方法

  当onStop方法被调用时,该Activity不再处于可见状态。

(frameworks/base/core/java/android/app/Activity.java)@CallSuperprotected 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)@CallSuperprotected 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)@CallSuperprotected void onRestart() {    mCalled = true;}

3. 总结

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

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android(安卓)触控事件解析 - Mastering The Android(安卓)Touch
  5. Android与H5的交互
  6. Android的布局和Intent笔记和常用实例
  7. Android设计模式系列--工厂方法模式
  8. [Android]实现静默安装APK的两种方法
  9. Android旋转屏幕时阻止activity重建

随机推荐

  1. 最近,又有人在谈论Android的前景了!深入解
  2. android架构之美
  3. 19_利用android提供的HanziToPinyin工具
  4. cordova操作Android本地文件系统
  5. 两份安卓学习资料,我建议你看完
  6. 对Android初学者学习中的几点建议
  7. 最近Android挺火啊,都没有什么感想吗
  8. Android(安卓)抽屉效果的导航菜单实现
  9. 华硕 Eee Pad Transformer 3G 版本台湾地
  10. Android省电策略