你所不知道的Activity生命周期
背景知識
典型的生命周期,就不說了,相信大家一定知道,初學者也可以百度,很多,這里大只記錄一下一些生命周期中的細節
先后順序
-
onStart 和onResume、onPause 和 onStop的實質性區別:
其實從實際過程中來說,兩者就是差不多的,我們甚至可以只保留一組,但是盡然Android實現了重復接口,肯定有它的意義,其實兩者的回調時機不一樣, onStart和onStop是從Activity是否可見這個角度來回調的,而onResume和onPause是從是否位于前臺來回調的。
-
如果從Activity A跳轉到Activity B,那么B的onResume和A的onPause哪一個方法先執行呢?
我們可以通過源碼分析,也可以通過打Log日志來分析,我這邊就直接記錄結果了,有興趣的朋友可以自己深入分析一下,或者通過Log來確認一下, 舊Activity的onPause方法先調用,然后新Activity才會啟動 ,從另外一個角度講,Android的官方文檔對onPause的解釋有這樣一句話: 不能再onPause中做重量級操作,因為必須onPause執行完成之后新的Activity才能Resume ,所以我們知道,不能再onPause和onStop里面做耗時性操作,尤其是onPause如果一定要的話就再onStop中執行。
異常生命周期
- 資源相關的系統配置發生改變導致Activity被殺死并重新創建
默認情況下,不會做任何處理,當時系統配置發生改變導致Activity被銷毀并重新創建,這個時候 Activity的onPause,onStop,onDestroy方法都會被調用,同時,由于是異常中止,所以系統還會調用onSaveInstanceState來保存當前數據 ,onSaveInstanceState會在onStop之前調用,與onPause沒有一定的先后順序。而且只有在 Activity是異常中止的情況下onSaveInstanceState才會被調用 。當Activity被重建之后,系統會調用onRestoreInstanceState來獲取銷毀時保存的數據,并且以Bundle的形式傳遞給當前方法和onCreate方法,因此我們可以通過onCreate和onRestoreInstanceState來分析Activity有沒有被創建,從時序上來說onRestoreInstanceState的調用在onStart之后。 同時我們需要知道onSaveInstanceState和onRestoreInstanceState都只有在Activity被異常中止的時候才會被調用,正常是不會的,而且數據的存儲和恢復,都是系統自動幫我們完成的 - 資源內存不足導致優先級低的Activity被殺死
Activity的優先級分為三種:- 前臺Activity——正在和用戶交互的Activity,優先級最高。
- 可見但非前臺Activity——比如被一個彈出的對話框覆蓋,用戶可見,但是無法進行直接交互。
- 后臺Activity——已經被暫停的Activity比如已經執行了onStop,優先級最低。
當系統內存不足的時候,系統就會按照上述的優先級來殺死目標Activity所在的進程,并且通過onSaveInstanceState和onRestoreInstanceState來存儲和恢復數據。
總結
我們知道了,當系統配置發生改變的時候我們的Activity會被殺死和重建,當然我們也可以配置,告訴系統,我們不想重建,比如:橫屏的時候我不想重建Activity,我就可以配置configChanges屬性來實現
android:configChanges="orientation"
如果我們想指定多個值我們可以通過'|'來連接起來比如:
android:configChanges="orientation|keyboardHidden"
雖然configChanges的值有很多,但是我們常用的也就locale、orientation和keyboardHidden,這三個,下面是所有屬性的介紹,大家可以了解一下:
項目 含義 mcc 此項表示mcc代碼發生了改變(SIM卡唯一標識IMSI 中的國家代碼) mnc 此項表示mnc代碼發生了改變(SIM卡唯一標識IMSI 中的運營商代碼) locale 本地位置發生改變,一般指切換了系統語言 touchscreen 觸摸屏發生了改變(正常不會發生可以忽略) keyboard 鍵盤類型發生了改變(用戶外接鍵盤) keyboardHidden 鍵盤的可訪問性發生改變 navigation 系統當行方式發生了改變 screenLayout 屏幕布局發生了改變 fontScale 系統字體縮放比例發生改變 uiMode 用戶界面模式發生了改變(夜間模式) orientation 屏幕方向發生了改變(很常用,選轉屏幕) screenSize 屏幕的尺寸信息發生了改變 smallestScreenSize 設備的物理屏幕尺寸發生改變 layoutDirection 當布局的方向發生改變時 來自:http://www.jianshu.com/p/b04a06eb2c9e