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


(注:源代码为android-8.1)

0. 前言

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


1. 生命周期总览

  Activity的生命周期如下图所示,主要由七个方法来界定。这七个方法除了onRestart方法外,另外六个可以分为三对来看待:onCreateonDestroy相对应,onStartonStop相对应以及onResumeonPause相对应。
Android源码阅读分析:Activity生命周期_第1张图片
  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. 【转】Android 虚拟机安装APK文件方法
  2. 新书内容连载(2):Android Activity的生命周期
  3. Android USB Gadget复合设备驱动(打印机)测试方法
  4. android sdk离线升级方法
  5. Android Handler内存泄漏解决方法
  6. Android异步消息处理机制(源码分析+面试题)
  7. [Android]应用语言切换的三种方法
  8. Ubuntu共享WiFi(AP)给Android方法【修正版】

随机推荐

  1. ios与android的比较
  2. android上gdb coredump步骤
  3. android 中java编程的意外事件处理
  4. Android 应用程序发布流程注意事项(整理)
  5. Android 自定义组件02
  6. Android(安卓)开发源码分享
  7. Android 自定义View 解耦框架
  8. Android(安卓)string.xml 显示特殊符号
  9. 22. Android中的AIDL
  10. android开源代码