Activity相關知識總結
異常情況下的生命週期
情況一:資源相關的系統配置發生改變導致Activity被銷燬並重建
比較典型的就是橫豎屏的切換後者解析度的變化,預設情況下系統會將Activity銷燬並重建。此時系統會呼叫onSaveInstanceState方法儲存Activity的狀態(判斷的標準是系統認為Activity唄銷燬後,會立刻被重建),onSaveInstanceState的呼叫發生在onStop之前,與onPause的呼叫沒有固定的先後順序。Activity被重建時,系統會呼叫onRestoreInstanceState方法,它的呼叫發生在onStart之後,與onResume沒有固定的先後順序。在Activity被重建時,可以選擇在onRestoreInstanceState或onCreate方法中實現,唯一的區別是,如果onRestoreInstanceState被呼叫那引數中的bundle物件一定不會null。
在異常情況下,系統銷燬Activity時,會預設儲存一些檢視狀態,比如LIstVIew的滾動位置,EditText輸入的內容和聚焦狀態。這是因為View也有onSaveInstanceState和onRestoreInstanceState方法。當Activity被銷燬時,首先觸發其onSaveInstanceState方法,然後Activity會委託(或者叫分發任務)它的wIndow物件儲存相關資料,觸發其onSaveInstanceState方法,繼而window物件會委託它所包含的View層級,逐層觸發各個view的onSaveInstanceState方法,這樣就就儲存狀態的任務,分發到了Activity的檢視所包含的所有View物件。
情況二 記憶體不足導致系統需要銷燬低優先順序的Activity
Activity根據優先順序的高低,可以分為三種:
(1)前臺Activity——處於onResume狀態,正在與使用者互動
(2)可見Activity——處於onPause狀態,使用者可見,但是不能互動。比如從Activity觸發彈出對話方塊,此時Activity即為可見狀態,但是不可互動。
(3)後臺Activity——處於onStop的狀態,Activity不可見,已經暫停。
系統記憶體資源不足時,會按照優先順序去殺掉目標Activity所在的程序,並在後續通過onSaveInstanceState和onRestoreInstanceState方法來儲存和恢復資料。
系統配置項裡有很多內容,如果某個內容項發生變化時,我們不希望Activity被系統重建,可以給Activity在manifest配置中指定configChanges屬性。當Activity指定了configChanges屬性後,相應的系統配置項發生變化時,Activity將不會被銷燬,onSaveInstanceState和onRestoreInstanceState方法也不會被呼叫,取而代之的是,系統會呼叫Activity的onConfigurationChanged方法。
Activity啟動模式
task和back stack
task是一組Activity的集合,back stack是task的資料結構實現。task是可以跨應用,跨程序的。
taskAffinity
allowTaskReparenting
FLAGS