原文連結 https://mp.weixin.qq.com/s?__biz=MzAxNjg3M...
在上一篇文章
Activity生命周期之正常情況中,分析了正常情況的生命周期的排程,除了使用者正常操作所引起的生命周期的變化外,還存在着一些異常情況,比如系統配置的改變或者記憶體不足的情況,這些情況下,Activity可能被殺死。
-
相關系統配置改變導緻生命周期的變化
典型的情況就是手機橫豎屏的變化,預設情況下,當Activity處于豎屏狀态的時候,突然旋轉螢幕,Activity會被銷毀并且重建,當然我們也可以阻止重新建立Activity(文末提供)。
預設情況下,如果Activity不做任何處理,系統配置改變後,Activity會被銷毀并重新建立。銷毀過程,Activity的
、onPause
onStop
都會調用,同時由于Activity在異常情況下終止的,系統會調用onDestroy
來儲存目前的Activity的狀态,這個方法在onSaveInstanceState
onStop
之前調用。注意 這個方法隻在Activity被異常終止的情況下調用,正常情況下Activity是不會調用這個方法。
當Activity被重新建立後,系統會調用
,并且把Activity銷毀時onRestoreInstanceState
方法所儲存的onSaveInstanceState
對象傳遞給Bundle
和onRestoreInstanceState
方法。是以我們可以通過OnCreate
onRestoreInstanceState
方法來判斷Activity是否被重建了,如果是重建,就可以取出之前儲存的資料并恢複。OnCreate
調用在onRestoreInstanceState
onStart
之後。
銷毀至重建的流程:
->onPause
onSaveInstanceState
onStop
->(銷毀後重建)onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
image
同時,異常情況下終止,會調用
來儲存目前的狀态,并在onSaveInstanceState
OnCreate
onRestoreInstanceState
裡恢複資料。
舉個栗子
儲存資料
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("test","儲存的資料");
Log.i("》》》A"," onSaveInstanceState 開始儲存資料");
}
擷取資料
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null){
String data = savedInstanceState.getString("test");
Log.i("》》》A"," onCreate 擷取的資料:"+data);
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String data = savedInstanceState.getString("test");
Log.i("》》》A"," onRestoreInstanceState 擷取的資料:"+data);
}
-
記憶體不足導緻Activity被殺死
這種情況不好模拟,其資料存儲、恢複過程和情況1完全一緻。Activity的優先級從高到低可以大緻分為一下三種:
- 前台Activity——正在和使用者互動的Activity,優先級最高。
- 可見但非前台Activity——比如Activity中彈出了一個對話框,導緻Activity可見但無法和使用者直接互動。
- 背景Activity——已經被暫停或者停止的Activity,優先級最底。
以上我們分析了系統的資料存儲和恢複機制,當然也有辦法讓系統不去重建Activity,
configChanges
屬性,比如
android:configChanges="orientation|screenSize"
,這種情況下,當螢幕旋轉時,Activity不會被重新建立。
至此,關于Activity在正常情況和異常情況下的生命周期介紹結束了,對Activity的生命周期應該也有了深入的了解了。
歡迎關注我的部落格:
https://blog.manjiexiang.cn/歡迎關注微信号:春風十裡不如認識你
image.png