- 原文地址:The Android Lifecycle cheat sheet — part I: Single Activities
- 原文作者:Jose Alcérreca
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者:IllllllIIl
- 校對者:tanglie1993,atuooo
Android 系統的目的是讓使用者增強控制權並且讓他們簡便地使用應用程式。例如,一個 app 的使用者可能會旋轉螢幕,回覆一條通知資訊,或者切換到另一個任務,而使用者應該能夠在這類操作後繼續流暢地使用這個 app。
為了提供這種使用者體驗,你應該知道怎麼管理元件的生命週期。元件可以是一個 Activity,一個 Fragment,一個 Service,或者 Application 本身,甚至是在默默執行的程式。元件有生命週期,生命週期會在多種狀態中變換。當狀態發生變化時,系統會通過一個生命週期回撥方法通知你。
為了更好解釋生命週期是怎麼運作的,我們定義了根據現有元件進行分類的一系列使用者場景。
第一部分: Activities — 單一 activity 的生命週期 (就是本文)
第二部分: 多個 activities — 跳轉和返回棧(back stack)
第三部分: Fragments — activity 和 fragment 的生命週期
它們的圖表也提供了 PDF格式備忘錄,以方便查閱。
除非特別說明,接下來的這些場景展示了這些元件的預設行為。
如果你發現有錯誤或者遺漏了什麼重要的東西,請在下方評論。
第一部分: Activities
單一 Activity — 場景 1:應用被結束並且重啟
觸發原因:
- 使用者按下了 返回鍵,或者是
Activity.finish()
方法被呼叫
這個最簡單的場景說明了一個單一 activity 的應用被使用者開啟,結束,和重啟時發生了什麼:
場景 1:應用被終止並且重啟
狀態處理
- onSaveInstanceState 不會被呼叫 (因為 activity 被結束了,你不需要儲存狀態)
- onCreate 沒有 Bundle 物件,如果重新開啟應用的話。因為先前的 activity 結束了,也不需要恢復狀態。
單一 Activity — 場景 2:使用者切換出去
觸發原因:
- 使用者按了 Home 鍵
- 使用者切換到另一個應用(點選虛擬按鍵(Overview menu),點選一個通知,接聽來電,等等)
場景 2:使用者切換出去
在這個場景中系統會 stop 這個 activity,但不會馬上結束它。
狀態處理
當你的 activity 進入 Stopped 狀態,系統會使用 onSaveInstanceState 去儲存應用的狀態以防系統一段時間後終止這個應用的程式 (請看下面)。
假設應用的程式沒有被終止,這個應用的例項會常駐在記憶體,儲存所有狀態。當這個 activity 回到前臺工作時,它會恢復這些狀態。你不需要重新初始化這些之前已生成的元件。
單一 Activity — 場景 3:配置發生變化
觸發原因:
- 配置發生變化,例如螢幕旋轉
- 在多視窗模式下,使用者調整視窗大小
場景 3:螢幕旋轉或其他配置變化
狀態處理
像螢幕旋轉或視窗大小改變,這種配置變化應該能夠讓使用者在變化後繼續無縫使用。
- activity 會被完全 destroy,但是 activity 的狀態會被儲存下來並在下一個例項中恢復。
- 在
onCreate
和onRestoreInstanceState
中的 Bundle 物件是相同的。
單一 Activity — 場景 4:應用被系統暫停
觸發原因:
- 開啟多視窗模式 (API 24+)並且應用失去焦點
- 另一個應用部分地覆蓋在正在執行的應用上面(例如一個購買對話方塊,一個執行時許可權確認對話方塊,一個第三方登陸對話方塊...)
- 呼叫意圖選擇器,例如呼叫了分享對話方塊
場景 4:應用被系統暫停
這個場景不適用於以下情況:
- 對話方塊屬於同一個應用。彈出一個警告對話方塊或者一個 DialogFragment 並不會暫停(執行 onPause 方法)被遮擋住的 activity。
- 通知。使用者收到一個新通知或者拉下通知欄不會暫停被遮擋住的 activity。
延伸閱讀
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。