先上經典的Activity生命周期圖
Case 1: A Activity 跳轉到 B Activity
ActivityStack: FirstActivity onPause
ActivityStack: SecondActivity onCreate
ActivityStack: SecondActivity onStart
ActivityStack: SecondActivity onResume
ActivityStack: FirstActivity onSaveInstanceState
ActivityStack: FirstActivity onStop
從A Activity 跳轉到 B Activity,是先調用A Activity的onPause,然后走完B Activity的生命周期,最后才走A Activity的 onStop
Case 2: A B C 順序的Activity,C Activity 后臺被殺
// SecondActivity 啟動 ThirdActivity
ActivityStack: SecondActivity onPause
ActivityStack: ThirdActivity onCreate
ActivityStack: ThirdActivity onStart
ActivityStack: ThirdActivity onResume
ActivityStack: SecondActivity onSaveInstanceState
ActivityStack: SecondActivity onStop
// 應用退到后臺
ActivityStack: ThirdActivity onPause
ActivityStack: ThirdActivity onSaveInstanceState
ActivityStack: ThirdActivity onStop
// 殺進程,重新啟動APP
ActivityStack: ThirdActivity onCreate
ActivityStack: ThirdActivity onStart
ActivityStack: ThirdActivity onRestoreInstanceState
ActivityStack: ThirdActivity onResume
// 按返回鍵。創建SecondActivity,并調用SecondActivity的onRestoreInstanceState
ActivityStack: ThirdActivity onPause
ActivityStack: SecondActivity onCreate
ActivityStack: SecondActivity onStart
ActivityStack: SecondActivity onRestoreInstanceState
ActivityStack: SecondActivity onResume
ActivityStack: ThirdActivity onStop
ActivityStack: ThirdActivity onDestroy
ThirdActivity后臺時,APP被殺。由于已經調用了ThirdActivity的onSaveInstanceState,所以重啟APP,恢復的是ThirdActivity
多Activity時應用被殺,重啟APP不會把多Activity都創建,只會創建棧頂的Activity,但是Activity棧記錄還會保留,按Back鍵依然會返回并創建SecondActivity
Case 3: A B C 順序的Activity,C Activity 前臺被殺
// 從SecondActivity跳轉到ThirdActivity
ActivityStack: SecondActivity onPause
ActivityStack: ThirdActivity onCreate
ActivityStack: ThirdActivity onStart
ActivityStack: ThirdActivity onResume
ActivityStack: SecondActivity onSaveInstanceState
ActivityStack: SecondActivity onStop
// ThirdActivity前臺時,進程被殺
ActivityStack: SecondActivity onCreate
ActivityStack: SecondActivity onStart
ActivityStack: SecondActivity onRestoreInstanceState
ActivityStack: SecondActivity onResume
由于ThirdActivity沒有來得及調用onSaveInstanceState,所以恢復的是SecondActivity
出現情景:ThirdActivity 位于前臺,不可能由于內存不足而被系統回收(內存不足,最多就拋OOM)。只可能出現Crash或被命令行強制kill。
Case 4:onNewIntent()
SingleTop/SingleTask的Activity,自己啟動自己的時候
onPause
onNewIntent
onResume
從別的任務棧start棧頂的SingleTop/SingleTask的Activity
ActivityStack: ThirdActivity onPause
ActivityStack: SecondActivity onNewIntent
ActivityStack: SecondActivity onRestart
ActivityStack: SecondActivity onStart
ActivityStack: SecondActivity onResume
ActivityStack: ThirdActivity onSaveInstanceState
ActivityStack: ThirdActivity onStop
Case 5:不保留活動
// Activity 退到后臺
ActivityStack: FirstActivity onPause
ActivityStack: FirstActivity onSaveInstanceState
ActivityStack: FirstActivity onStop
ActivityStack: FirstActivity onDestroy
// Activity回到前臺
ActivityStack: FirstActivity onCreate
ActivityStack: FirstActivity onStart
ActivityStack: FirstActivity onRestoreInstanceState
ActivityStack: FirstActivity onResume
Activity恢復原則
單Activity恢復
恢復該Activity多Activity恢復
只會恢復棧頂的activity,其他Activity不會創建。但是activity record里是有記錄其他Activity。假如按下返回鍵,就會創建其他Activity
注意點
- onSaveInstanceState :調用位于 onPause 到 onStop之間
- onRestoreInstanceState :Activity被系統銷毀了(后臺回收進程/設置不保留活動模式時退后臺時),當Activity恢復,調用位于 onStart 到 onResume之間.
- onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調用的
- onRestart: 調用位于onStop到onStart之間
應用被殺
系統回收 / 崩潰 / 強制殺進程 ,都不會回調系統Activity生命周期的函數