標籤:
Activity的生命週期分為兩部分:1,典型情況下的生命週期,指在使用者參與的情況下Activity所經過的生命週期的改變;2,異常情況下的生命週期,指Activity被系統回收或者當前裝置的Configuration發橫改變從而導致Activity被銷毀重建。
典型情況下的生命週期
在正常情況下,生命週期如下:
onCreate
表示Activity正在被建立,這是生命週期的第一個方法。在這個方法裡可以做一些初始化工作,比如調用setContentView去載入介面布局,初始化Activity所需的資料等。
onRestart
表示Activity正在重新啟動。一般情況下,噹噹前Activity從不可見到重新變為可見狀態時,onRestart方法會被調用。這種情況一般是使用者導致的,比如使用者按Home鍵切換到案頭或使用者開啟一個新的Activity,當前的Activity就會暫停,也就是onPause和onStop被執行了,接著使用者又回到了這個Activity,就會出現這種情況了。
onStart
表示Activity正在被啟動,即將開始,這時Activity已經可見了,但是還沒有出現在前台,還無法和使用者互動。也就是Activity已經出現了,但我們還不能看到。
onResume
表示Activity已經可見了,並且出現在前台開始活動了。
onPause
表示Activity正在停止,正常情況下,接著onStop就會被調用。此時可以執行一些儲存資料,停止動畫的操作,但是注意不能太耗時,因為這個方法結束,下一個Activity的onResume才能執行,如果時間太長會造成Activity切換卡頓。
onStop
表示Activity即將停止,可以做一些重量級的回收,但最好也不要太耗時。
onDestroy
表示Activity即將被銷毀,這是最後一個回調,做所有資源的釋放和回收。
經典圖片:
具體解釋
1,針對一個特定的Activity,第一次啟動,回調是onCreate->onStart->onResume。
2,當使用者開啟新的Activity或者切換到案頭時,回調是onPause->onStop。這裡有一個特殊情況,如果新的Activity採用透明主題,那麼當前Activity不會回調onStop。
3,當使用者再次回到Activity時,回掉是onRestart->onStart->onResume。
4,當使用者按Back鍵時,回調是onPause->onStop->onDestroy。
5,當Activity被系統回收後再次開啟,生命週期回調過程和(1)一樣。是生命週期方法一樣,不代表過程一樣。
異常情況下的生命週期
我們應該能夠猜到,Activity除了被使用者殺死外還有可能被系統殺死。情況如下:
情況1:資源相關的配置發生改變導致Activity被殺死並重新建立
拿最簡單的圖片資源來說吧,手機橫屏和豎屏時載入的圖片可能不是一個資源,那麼此時就會導致系統配置發生改變,在預設情況下,Activity會被銷毀並且重新建立,當然我們可以組織系統重新建立我們的Activity。Activity出現意外情況->onSaveInstanceState然後又兩種情況 ->onDestroy ->onCreate->onRestoreInstanceState當前Android已經做了一定程度的資料恢複了。當然也可以重寫onSaveInstanceState和onRestoreInstanceState方法來實現自訂的資料的恢複。
情況2:資源記憶體不足導致優先順序低的Activity被回收
這種情況不容易類比,但是很容易能夠想到。1,前台Activity——正在和使用者互動,優先順序最高。2,可見但非前台Activity——比如彈出了一個對話方塊,導致Activity無法和使用者直接互動。3,後台Activity——已經被暫停Activity,優先順序最低。這些也會回調onSaveInstanceState和onRestoreInstanceState來儲存和恢複資料。一些工作不適合放在後台Activity中執行,最好是放進Service中執行。
阻止因系統配置發生改變而重新建立Activity
在mainfest中配置:
android:configChanges="orientation"
如果想指定多個值,用“|”來串連。
比如
android:configChanges="orientation|keyboardHidden"
這個配置項是非常多的,下面詳細介紹:
| 項目 |
含義 |
| mcc |
SIM卡唯一標識IMSI(國際移動使用者識別碼)中的國家代碼,由三位元組成,中國是460。此項標識mcc發生改變 |
| mnc |
SIM卡唯一標識IMSI(國際移動使用者識別碼)中的電訊廠商代碼,由兩位元組成,中國移動TD是00,中國聯通是01,中國電信是03。此項標識mnc發生改變 |
| locale |
裝置的本地位置發生了改變,一般是指切換了系統語言 |
| touchscreen |
無視它 |
| keyboard |
鍵盤類型發生了改變,比如用了外插鍵盤 |
| keyboardHidden |
鍵盤的可訪問性發生了改變,如果拔掉了外插鍵盤 |
| navigation |
無視它 |
| screenLayout |
螢幕布局發生改變,比如啟用了另一個螢幕 |
| fontScale |
系統字型發生改變 |
| uiMode |
使用者介面發生了改變,比如開啟了夜間模式(API8添加) |
| orientation |
螢幕方向發生改變 |
| screenSize |
旋轉也會導致這個改變 |
| smallestScreenSize |
無視他 |
| layoutDirection |
無視他 |
Android-Activity的生命週期全面分析