天天看點

Activity生命周期(二)異常情況

原文連結 https://mp.weixin.qq.com/s?__biz=MzAxNjg3M...

在上一篇文章

Activity生命周期之正常情況

中,分析了正常情況的生命周期的排程,除了使用者正常操作所引起的生命周期的變化外,還存在着一些異常情況,比如系統配置的改變或者記憶體不足的情況,這些情況下,Activity可能被殺死。

  1. 相關系統配置改變導緻生命周期的變化

    典型的情況就是手機橫豎屏的變化,預設情況下,當Activity處于豎屏狀态的時候,突然旋轉螢幕,Activity會被銷毀并且重建,當然我們也可以阻止重新建立Activity(文末提供)。

    預設情況下,如果Activity不做任何處理,系統配置改變後,Activity會被銷毀并重新建立。銷毀過程,Activity的

    onPause

    onStop

    onDestroy

    都會調用,同時由于Activity在異常情況下終止的,系統會調用

    onSaveInstanceState

    來儲存目前的Activity的狀态,這個方法在

    onStop

    之前調用。注意 這個方法隻在Activity被異常終止的情況下調用,正常情況下Activity是不會調用這個方法。

    當Activity被重新建立後,系統會調用

    onRestoreInstanceState

    ,并且把Activity銷毀時

    onSaveInstanceState

    方法所儲存的

    Bundle

    對象傳遞給

    onRestoreInstanceState

    OnCreate

    方法。是以我們可以通過

    onRestoreInstanceState

    OnCreate

    方法來判斷Activity是否被重建了,如果是重建,就可以取出之前儲存的資料并恢複。

    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);
}
           
  1. 記憶體不足導緻Activity被殺死

    這種情況不好模拟,其資料存儲、恢複過程和情況1完全一緻。Activity的優先級從高到低可以大緻分為一下三種:

    1. 前台Activity——正在和使用者互動的Activity,優先級最高。
    2. 可見但非前台Activity——比如Activity中彈出了一個對話框,導緻Activity可見但無法和使用者直接互動。
    3. 背景Activity——已經被暫停或者停止的Activity,優先級最底。
    當系統記憶體不足的時候,系統就會按照上述優先級從低到高來殺死目标Activity。并在後續通過onSaveInstance和onRestoreInstance來存儲和恢複資料。

以上我們分析了系統的資料存儲和恢複機制,當然也有辦法讓系統不去重建Activity,

configChanges

屬性,比如

android:configChanges="orientation|screenSize"

,這種情況下,當螢幕旋轉時,Activity不會被重新建立。

至此,關于Activity在正常情況和異常情況下的生命周期介紹結束了,對Activity的生命周期應該也有了深入的了解了。

歡迎關注我的部落格:

https://blog.manjiexiang.cn/

歡迎關注微信号:春風十裡不如認識你

image.png