activity的生命週期(總結)

最愛媽媽本尊發表於2017-11-27

activity是安卓的四大元件之一,這篇文章帶大家一起總結生命週期的各個方法。我沒有貼一些列印log的程式碼,大家可以自己去嘗試,看看這個總結是否正確,如果錯誤,提交評論即可。

經典的生命週期流程圖


每次看到這個圖的時候,相信不少朋友對Activity的生命週期都比較清晰,但是如果沒有圖,讓你描述,你能很好的組織語音,有結構的描述清楚嗎?

我的總結

  • 1、開啟一個全新的activityA:oncreat-----onstart---onresume
  • 2、從activityA——activityB(全屏):activityA先執行onpause,然後activityA執行oncreat-----onstart---onresume,activityA在執行onstop
  • 3、從activityA——activityB(非全屏):activityA先執行onpause,然後activityA執行oncreat-----onstart---onresume,activityA不會執行onstop
  • 4、activityB(全屏)返回到activityA:activityB先執行onpause,activityA: onRestart -> onStart ->onResume,activityB在執行onstop——onDestory;
  • 5、activityB(非全屏)返回到activityA:activityB先執行onpause,activityA:onResume,activityB在執行onstop——onDestory;
  • 6、activityB返回到activityA:如果activityA已經被銷燬,activityA會重新建立,執行oncreat-----onstart---onresume,activityB的流程不變
  • 7、activityA按home鍵退居後臺:同2的流程,從home返回到activityA,同4的流程;

    一些特殊的方法

    onWindowFocusChanged
    在Activity視窗獲得或失去焦點時被呼叫並且當Activity被建立時是在onResume之後被呼叫,當Activity被覆蓋或者退居後臺或者當前Activity退出時,它是在onPause之後被呼叫(在這個方法中可以view已經繪製完成,可以獲取view的寬高等屬性

    onSaveInstanceState
    (1)在Activity被覆蓋或退居後臺之後,系統資源不足將其殺死,此方法會被呼叫;(2)在使用者改變螢幕方向時,此方法會被呼叫;(3)在當前Activity跳轉到其他Activity或者按Home鍵回到主屏,自身退居後臺時,此方法會被呼叫。第一種情況我們無法保證什麼時候發生,系統根據資源緊張程度去排程;第二種是螢幕翻轉方向時,系統先銷燬當前的Activity,然後再重建一個新的,呼叫此方法時,我們可以儲存一些臨時資料;第三種情況系統呼叫此方法是為了儲存當前視窗各個View元件的狀態。onSaveInstanceState的呼叫順序是在onstop之前。(android3.0之前:在onPause之前呼叫,在3.0之後,在onPause之後呼叫

    onRestoreInstanceState:
    有的人說這個方法和onSaveInstanceState是一對,其實不然,(1)在Activity被覆蓋或退居後臺之後,系統資源不足將其殺死,然後使用者又回到了此Activity,此方法會被呼叫;(2)在使用者改變螢幕方向時,重建的過程中,此方法會被呼叫。我們可以重寫此方法,以便可以恢復一些臨時資料。onRestoreInstanceState的呼叫順序是在onStart之後。(在當前Activity跳轉到其他Activity或者按Home鍵回到主屏,自身退居後臺時:onRestoreInstanceState不會呼叫,但是onSaveInstanceState會呼叫,這裡就是區別

    最後的總結

    當Activity被系統撤銷後重新建立時,儲存以及恢復資料的函式呼叫順序是:onSaveInstanceState(儲存資料)-->onCreate(恢復資料allstate)-->onRestoryInstanceState(恢復資料HierarchyState)。

    如果要取消切換螢幕方法重建activity,可以配置configChanges屬性:
    android:configChanges="keyboardHidden|orientation|screenSize(當支援的最小sdk版本大於android4.0需要設定這個屬性)"

相關文章