Activity生命週期基礎

前言:
  俗稱:好記性不如爛筆頭。
  學習任何技術其實也是一樣,誰敢保證看過一遍就會記住了,就會用了,至少我是不敢保證。所以我們需要經常回頭研究,而且會發現每一次的溫故都會有不一樣的收穫—溫故而知新,可以為師矣!
  還有,他人告知你的知識點是他人把研究結果分享給你的,而不是你自己研究的。所以要去實踐它,做到吸納它。
  

  • Activity啓動生命週期
  • Activity跳轉生命週期
  • Activity返回生命週期
  • Activity退出生命週期
  • Activity切後臺生命週期
  • Activity喚醒前臺生命週期
  • Activity橫豎屏生命週期
    Demo:點擊獲取代碼

     對於Android研發來說,四大組件的Activity本應該熟練掌握,這邊先做下對於Activity的啓動及正常界面跳轉時的生命週期筆記。
     我們來看一下這一張經典的生命週期流程圖:
    這裏寫圖片描述
    接下來,我將根據上圖所列舉的生命週期的調用順序通過log信息打印來說明其生命週期。

Code:

基類:在基類實現上圖生命週期並做Log信息打印

package com.sdf.aso.activitylifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

/**
 * Created by itsdf07 on 2017/3/29 10:44.
 * E-Mail: [email protected]
 * GitHub: https://github.com/itsdf07
 */

public class BaseActivity extends Activity {
    public final static String TAG = "dfsu";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onCreate :");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onStart :");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onResume :");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onPause :");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onStop :");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onRestart :");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onDestroy :");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onSaveInstanceState : outState = " + outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onRestoreInstanceState : savedInstanceState = " + savedInstanceState);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onConfigurationChanged : newConfig = " + newConfig);
    }
}

接下來實現用來簡單的驗證界面跳轉時的Activity(extend BaseActivity, 只簡單實現跳轉):
MainActivity.java –> FirstActivity.java –> SecondActivity.java –> MainActivity.java
以上Activity循環跳轉

步驟及Log信息:

  1. 從啓動到逐個循環跳轉
    1.1、啓動:正常的啓動或者Ide啓動MainActivity

    03-29 13:28:48.942 1700-1700/?com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate :
    03-29 13:28:48.974 1700-1700/? com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 13:28:48.974 1700-1700/? com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    

    1.2、從MainActivity —跳轉到—> FirstAcivity

    03-29 13:30:00.100 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 13:30:00.115 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onCreate :
    03-29 13:30:00.122 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStart :
    03-29 13:30:00.122 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onResume :
    03-29 13:30:00.558 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    

    1.3、從FirstActivity —跳轉到—> SecondActivity

    03-29 13:30:32.492 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onPause :
    03-29 13:30:32.508 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onCreate :
    03-29 13:30:32.519 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStart :
    03-29 13:30:32.519 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onResume :
    03-29 13:30:32.969 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStop :
    

    1.4、從SecondActivity —跳轉到—> MainActivity

    03-29 13:31:54.744 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onPause :
    03-29 13:31:54.762 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate :
    03-29 13:31:54.773 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 13:31:54.773 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    03-29 13:31:55.217 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStop :
  2. 在第1步的基礎上逐個返回到MainActivity在點擊返回退出程序

    2.1、從MainActivity —返回到—> SecondActivity

    03-29 13:36:44.967 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 13:36:44.972 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onRestart :
    03-29 13:36:44.973 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStart :
    03-29 13:36:44.973 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onResume :
    03-29 13:36:45.295 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    03-29 13:36:45.295 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
    

    2.2、從SecondActivity —返回到—> FirstActivity

    03-29 13:37:49.299 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onPause :
    03-29 13:37:49.302 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onRestart :
    03-29 13:37:49.302 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStart :
    03-29 13:37:49.302 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onResume :
    03-29 13:37:49.628 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStop :
    03-29 13:37:49.628 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onDestroy :
    

    2.3、FirstActivity —返回到—> MainActivity

    03-29 13:38:27.465 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onPause :
    03-29 13:38:27.472 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestart :
    03-29 13:38:27.472 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 13:38:27.472 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    03-29 13:38:27.805 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStop :
    03-29 13:38:27.805 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onDestroy :
    

    2.4、從MainActivity點返回退出程序

    03-29 13:38:41.731 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 13:38:42.106 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    03-29 13:38:42.106 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
    
  3. 前後臺切換(在MainActivity界面驗證)

    3.1、切後臺

    03-29 14:08:47.984 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 14:08:48.384 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    

    3.2、喚醒到前臺

    03-29 14:09:26.028 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestart :
    03-29 14:09:26.028 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 14:09:26.028 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    

    3.3、直接結束進程則不會有其他生命週期的函數調用

  4. 橫豎屏切換(在MainActivity界面驗證)
    在BaseActivity中增加橫豎屏時的生命函數:
    onSaveInstanceState :Activity 即將銷燬時保存數據
    onRestoreInstanceState :Activity 重建或者恢復時候取出數據
    當加上以上函數時,在執行第1點Activity跳轉的時候,比如MainActivity –> FirstActivity,將會在onStop前調用一次數據存儲onSaveInstanceState ,log信息如下:

    03-29 15:04:51.862 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 15:04:51.872 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onCreate :
    03-29 15:04:51.886 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStart :
    03-29 15:04:51.886 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onResume :
    --> 03-29 15:04:52.334 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onSaveInstanceState : outState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@34cea9e0}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@3700c499, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@e90835e}}]}]
    03-29 15:04:52.334 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    
    

    4.1、在Activity默認沒有設置android:configChanges或者設置爲:android:configChanges=”orientation|keyboardHidden”時,生命週期爲一致,都執行了銷燬流程並重新實例Activity,用例:MainActivity(默認沒設置)、FirstActivity(設置:android:configChanges=”orientation|keyboardHidden”)
    執行橫屏如下:

    03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onSaveInstanceState : outState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@e6a74a1}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@2862e6c6, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@1790c687}}]}]
    03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
    03-29 14:25:01.808 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate :
    03-29 14:25:01.823 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 14:25:01.825 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestoreInstanceState : savedInstanceState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@e6a74a1}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@2862e6c6, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@1790c687}}]}]
    03-29 14:25:01.825 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    
    

    恢復豎屏

    03-29 14:25:36.571 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 14:25:36.572 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onSaveInstanceState : outState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@262cab4c}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@25fe4795, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@195210aa}}]}]
    03-29 14:25:36.572 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    03-29 14:25:36.572 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
    03-29 14:25:36.608 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate :
    03-29 14:25:36.620 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 14:25:36.622 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestoreInstanceState : savedInstanceState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@262cab4c}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@25fe4795, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@195210aa}}]}]
    03-29 14:25:36.622 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    
    

    4.2、在Activity默認沒有設置android:configChanges或者設置爲:android:configChanges=”orientation|screenSize”時,Activity的生命週期與4.1中不一樣,不會重新執行相應的生命週期,而是執行了onConfigurationChanged 函數,用例:SecondActivity
    執行橫屏如下:

    03-29 15:43:27.398 22643-22643/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onConfigurationChanged : newConfig = {1.0 460mcc2mnc zh_CN ldltr sw360dp w598dp h335dp 480dpi nrml land finger -keyb/v/h -nav/h s.62}
    
    

    恢復豎屏

    03-29 15:43:29.753 22643-22643/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onConfigurationChanged : newConfig = {1.0 460mcc2mnc zh_CN ldltr sw360dp w360dp h567dp 480dpi nrml port finger -keyb/v/h -nav/h s.63}
    
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章