目錄
- 生命周期
- 任務棧/啟動模式
- onSaveInstanceState()
- scheme跳轉協(xié)議
- 補充結論
1. 生命周期
- 首次啟動
- 按下返回鍵
- 按Home鍵,再次打開
- 屏幕旋轉
- 打開SecondActivity
2. 任務棧/啟動模式
可以在 manifest 中設置 <activity/> 的 launchMode 屬性:
- Standard:總是允許創(chuàng)建新的相同的 Activity (默認)
- SingleTop:當棧的最頂端有相同的 Activity 時骚揍,只創(chuàng)建一個燎含,當不同層次有相同的 Activity,允許創(chuàng)建新的 Activity
- SingleTask:即 single in task持偏,該實例在本棧中只存在一個
- SingleInstance:在本棧中只存在一個實例(一個棧中只允許一個 Activity 存在)
3. onSaveInstanceState()
何時調(diào)用:
- 當某個 Activity “容易”被系統(tǒng)銷毀時
- 屏幕橫豎屏切換時
- 前兩種是系統(tǒng)回調(diào),還有一情況是在程序代碼中自己調(diào)用了該方法
注意事項:
- 當用戶自己按下 Back 鍵,屬于主動銷毀 Activity甘磨,此時是不會回調(diào)該方法的
- 什么叫容易:當 Activity 不能被完全看見卻又未執(zhí)行onDestroy方法時(即處于 onPaus 或 onStop 狀態(tài)下)逞泄,系統(tǒng)就可能因為內(nèi)存緊缺而銷毀這些 Activity患整。
- 系統(tǒng)銷毀這些 Activity 時會依據(jù)其所在進程的優(yōu)先級拜效,優(yōu)先級越低越容易被銷毀:
前臺進程 > 可見進程 > 服務進程 > 后臺進程 > 空進程,通常被銷毀都是處在后臺進程這個級別
做了什么:
- 系統(tǒng)回調(diào)該方法時會保存與 UI 有關的信息各谚,具體講紧憾,會為布局中的每個 View 回調(diào) onSaveInstanceState() 方法來保存視圖信息,以便在重建 Activity 時恢復原狀昌渤,但該 View 需要包含id屬性
- 對 Activity 中的一些成員變量系統(tǒng)默認是不會恢復存儲的赴穗,但它們有些又非常重要,此時就需要重寫該方法將有關信息存儲在 Bundle 數(shù)據(jù)包中
onRestoreInstance():
- onSaveInstanceState()和onRestoreInstance()的回調(diào)并不是成對的膀息,onRestoreInstance()方法被調(diào)用的前提是Activity的確被系統(tǒng)銷毀了
- 盡管onSaveInstanceState()方法已經(jīng)被調(diào)用了(無論是系統(tǒng)調(diào)用的還是自己調(diào)用的)般眉,也只是說明Activity存在被回收銷毀的可能性,若沒有被回收而正常返回潜支,則只會回調(diào)onRestart(方法
- 在 onSaveInstanceState() 中保存的數(shù)據(jù)甸赃,重建 Activity 時會傳到 onRestoreInstance() 和 onCreate()的Bundle參數(shù)中,不過我們通常會在onCreate()方法中去恢復數(shù)據(jù)
一些結論:
- Activity 在不可見(或不完全可見)但又未執(zhí)行 onDestroy() 時可能被系統(tǒng)回收冗酿,此時會回調(diào) onSaveInstanceState() 保存實例信息埠对。但由用戶主動銷毀的情況是不會調(diào)用該方法的
- 只有 Activity 真的被系統(tǒng)銷毀了,重建時才會回調(diào) onRestoreInstance() 方法恢復數(shù)據(jù)(否則 Bundle 為空)裁替,但通常的是在 onCreate() 的Bundle中恢復數(shù)據(jù)
4. scheme跳轉協(xié)議
應用場景:
- 服務端下發(fā)URL路徑项玛,客戶端根據(jù)URL跳轉頁面
- 從H5頁面跳轉到相應的App的Activity
- App根據(jù)URL跳轉到另一個App的指定頁面
5. 補充結論
- onStart()和onStop是從是否可見這個角度來回調(diào)的,而onResume()和onPause()是從是否位于前臺這個角度來回調(diào)的
- 舊的Activity的onPause()執(zhí)行完后新的Activity才能Resume胯究,所以不能在onPause()和onStop()中執(zhí)行耗時操作稍计,特別是onPause()
- 當系統(tǒng)配置發(fā)生變化后,Activity會被重建裕循,若不想Activity重建臣嚣,可以給Activity指定configChanges屬性,這樣取而代之的是回調(diào)Activity的onConfigchangd()方法
- TaskAffinity屬性標識了一個Activity所需的任務棧剥哑,默認情況下為應用的包名硅则。可以給每個Activity都單獨指定TaskAffinity屬性株婴,它的值是一個字符串怎虫,中間必須包含包名分隔符"."。它和singleTask啟動模式配合使用才能生效
- 棧內(nèi)復用的Activity在重新回到前臺時會回調(diào)onNewIntent()方法困介,但onCreate()大审、onStart()不會被調(diào)用