天天看點

全面解析Activity的生命周期

歡迎Follow我的GitHub, 關注我的CSDN.
全面解析Activity的生命周期

本文的合集已經編著成書,進階Android開發強化實戰,歡迎各位讀友的建議和指導。在京東即可購買:https://item.jd.com/12385680.html

全面解析Activity的生命周期

在Android應用中, Activity是最重要的元件, 其生命周期(Lifecycle)被大家所熟知.

但是, 大家需要注意一些細節, 才能在使用中得心應手.

Android的生命周期改變主要有兩種情況, 一是使用者參與Activity生命周期的改變, 二是系統回收或配置修改導緻的改變.

本文示例的GitHub下載下傳位址

Android的生命周期:

全面解析Activity的生命周期

1. 使用者參與

使用者最常見的兩種操作, 按Home鍵或Back鍵.

(1) 點選Home鍵, 暫停目前Activity, 調用onPause -> onStop; 再次傳回, 恢複目前頁面, 調用onRestart -> onStart -> onResume.

(2) 點選Back鍵, 關閉目前Activity, 調用onPause -> onStop -> onDestroy; 再次啟動則為重建, 從onCreate開始調用.

onStart()是Activity可見, 無法互動; onResume()是Activity可見, 可以互動. onPause是Activity無法互動, 必須執行前一個Activity的onPause完成, 後一個Activity才能啟動, 在onPause中, 不能執行複雜的操作, 否則會影響下一個Activity啟動速度. onStop是Activity關閉顯示.

注意: 啟動透明頁面隻調用onPause, 不會調用onStop, 即隻是不可以互動, 但仍在前台顯示. 啟動非透明頁, 會調用onPause -> onStop.

執行操作, 啟動透明頁, 關閉透明頁, 啟動非透明頁, 關閉非透明頁.

E/DEBUG-WCL: MainActivity: onPause
E/DEBUG-WCL: MainActivity: onSaveInstanceState
E/DEBUG-WCL: TranslateActivity: onPause
E/DEBUG-WCL: MainActivity: onResume
E/DEBUG-WCL: TranslateActivity: onStop
E/DEBUG-WCL: TranslateActivity: onDestroy
E/DEBUG-WCL: MainActivity: onPause
E/DEBUG-WCL: SecondActivity: onCreate
E/DEBUG-WCL: MainActivity: onSaveInstanceState
E/DEBUG-WCL: MainActivity: onStop
E/DEBUG-WCL: SecondActivity: onPause
E/DEBUG-WCL: MainActivity: onRestart
E/DEBUG-WCL: MainActivity: onStart
E/DEBUG-WCL: MainActivity: onResume
E/DEBUG-WCL: SecondActivity: onStop
E/DEBUG-WCL: SecondActivity: onDestroy
           

注意透明頁啟動, 首頁隻會調用onPause, 而不調用onStop.

onSaveInstanceState方法, 在關閉時, 都會執行, 但非系統調用啟動, 不會執行恢複資料的操作, 即onRestoreInstanceState方法.

2. 系統重建

在系統配置發生改變時, Activity就會重建, 由于是系統控制的關閉和啟動, 會調用onSaveInstanceState儲存資料, onRestoreInstanceState恢複資料.

E/DEBUG-WCL: MainActivity: onPause
E/DEBUG-WCL: MainActivity: onSaveInstanceState
E/DEBUG-WCL: MainActivity: onStop
E/DEBUG-WCL: MainActivity: onDestroy
E/DEBUG-WCL: MainActivity: onCreate
E/DEBUG-WCL: MainActivity: onStart
E/DEBUG-WCL: MainActivity: onRestoreInstanceState
E/DEBUG-WCL: MainActivity: onResume
           
onRestoreInstanceState在可以互動之前(onResume)執行, onSaveInstanceState在停止互動(onPause)之後執行.

系統會儲存關閉之前的視圖結構和暫存資料. 視圖具體儲存的資料項, 可以通過閱讀文檔, 也可以直接閱讀代碼. 搜尋視圖類的onSaveInstanceState方法, 類SavedState就是儲存的資料.

TextView的onSaveInstanceState

@Override
    public Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();

        // Save state if we are forced to
        boolean save = mFreezesText;
        int start = ;
        int end = ;

        if (mText != null) {
            start = getSelectionStart();
            end = getSelectionEnd();
            if (start >=  || end >= ) {
                // Or save state if there is a selection
                save = true;
            }
        }

        if (save) {
            SavedState ss = new SavedState(superState);
            // XXX Should also save the current scroll position!
            ss.selStart = start;
            ss.selEnd = end;

            if (mText instanceof Spanned) {
                Spannable sp = new SpannableStringBuilder(mText);

                if (mEditor != null) {
                    removeMisspelledSpans(sp);
                    sp.removeSpan(mEditor.mSuggestionRangeSpan);
                }

                ss.text = sp;
            } else {
                ss.text = mText.toString();
            }

            if (isFocused() && start >=  && end >= ) {
                ss.frozenWithFocus = true;
            }

            ss.error = getError();

            if (mEditor != null) {
                ss.editorState = mEditor.saveInstanceState();
            }
            return ss;
        }

        return superState;
    }
           
TextView主要儲存了内容Text和焦點Focus, 還有一些位置和錯誤資訊.

如果是恢複自定義資料, 恢複時機, 可以選擇onCreate或onRestoreInstanceState, 差別是onCreate需要判斷savedInstanceState是否為空, 而onRestoreInstanceState的參數savedInstanceState是一定非空, 否則不會調用. 推薦使用onRestoreInstanceState.

onCreate判空

if (savedInstanceState != null) {
            String txt = savedInstanceState.getString(EXTRA_TEXT);
            Log.e(TAG, "[onCreate]savedInstanceState: " + txt);
        }
           

在AndroidManifest的Activity屬性中添加

防止在旋轉螢幕時, 重繪頁面, 但螢幕仍可以旋轉.

不會調用生命周期, 而是調用onConfigurationChanged處理旋轉螢幕事件.

使用android:screenOrientation=”portrait”會使螢幕保持豎直, 無法旋轉.

動畫

全面解析Activity的生命周期

參考

OK, that’s all! Enjoy it!