歡迎Follow我的GitHub, 關注我的CSDN.
本文的合集已經編著成書,進階Android開發強化實戰,歡迎各位讀友的建議和指導。在京東即可購買:https://item.jd.com/12385680.html
在Android應用中, Activity是最重要的元件, 其生命周期(Lifecycle)被大家所熟知.
但是, 大家需要注意一些細節, 才能在使用中得心應手.
Android的生命周期改變主要有兩種情況, 一是使用者參與Activity生命周期的改變, 二是系統回收或配置修改導緻的改變.
本文示例的GitHub下載下傳位址
Android的生命周期:
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”會使螢幕保持豎直, 無法旋轉.
動畫
參考
OK, that’s all! Enjoy it!