Activity生命周期異常Case

先上經典的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恢復原則

  1. 單Activity恢復
    恢復該Activity

  2. 多Activity恢復
    只會恢復棧頂的activity,其他Activity不會創建。但是activity record里是有記錄其他Activity。假如按下返回鍵,就會創建其他Activity


注意點

  1. onSaveInstanceState :調用位于 onPause 到 onStop之間
  2. onRestoreInstanceState :Activity被系統銷毀了(后臺回收進程/設置不保留活動模式時退后臺時),當Activity恢復,調用位于 onStart 到 onResume之間.
  3. onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調用的
  4. onRestart: 調用位于onStop到onStart之間

應用被殺

系統回收 / 崩潰 / 強制殺進程 ,都不會回調系統Activity生命周期的函數

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 這是我第三遍看《Android開發藝術探索》這本書了,從第一遍看的云里霧里,第二遍略微明白之后,我決定看第三遍,并...
    陳添閱讀 884評論 2 8
  • 啟動與銷毀Activity 不同于使用 main() 方法啟動應用的其他編程范例,Android 系統會通過調用對...
    安卓Boy閱讀 1,797評論 3 5
  • 人生的道路就像爬山,上山的時候很難很累,但當你爬上山時你俯視看你一路走來的路,你就很有成就感。 ...
    愛籃球的三分鐘熱度閱讀 216評論 0 1
  • 如果形容你,味道該是范思哲同名男香。是溫柔又些許多情的雙魚男,而外表又是不動聲色的冷漠。 像什么植物嚀?該...
    有鹿與荇兒閱讀 101評論 0 0
  • 白淺,傾國傾城,氣質脫俗,四海八荒第一絕色,青丘帝君之女,青丘帝姬,墨淵上神之愛徒。 桃之夭夭,灼灼其華,任春風...
    周老師六點半閱讀 1,232評論 0 1