1. 程式人生 > >Android Activity 生命週期研究記錄

Android Activity 生命週期研究記錄

        Android Activity的生命週期分析,網上一抓就是一大把,但是總感覺太泛泛而談,重複東西太多了。最近收到這樣的需求:產品經理要求app的部分設定在使用者退出app後再次進入app時,這部分設設定回覆預設值,但是,如果使用者在應用中切換Activity後,應該保留被改動的設定。可以選擇的方案很多,幾經調研,分析利弊之後,筆者準備從Activity的生命週期下手,於是,這篇文章誕生了。

        根據需求,我理出裡需要關注的主要Method:

onCreate(Bundle savedInstanceState)

---- onRestoreInstance(Bundle savdeInstanceState)

---- onSaveInstanceState(Bundle outState)

onDestory()

        原因如下:

  1. onCreate和onDestory是入口和出口,我們可以知道app是否啟動或退出
  2. 但是onCreate有兩種情況呼叫,一種是第一次(這裡指完全退出app後)啟動這個Activity時,另一種是當這個Activity處於後臺並且手機記憶體不足時,它可能被回收,此時從其他Activity返回時會呼叫onCreate,只要通過調研,弄清楚onCreate時到底是不是第一次啟動這個Activity即可。所以筆者嚮導裡這兩個Method:onRestoreInstance() & onSaveInstanceState()

         於是寫demo,列印日誌觀察:

case 1 啟動app,從mainActivity跳轉到Activity2,然後點選返回按鈕返回,mainActivity的日誌日下:

onCreate()    savedInstanceState 此時為null

---- startActivity()

onSaveInstanceState()

onDestory()

---- 從Activity2返回MainActivity

onResume()    

case 2 在開發人員選項裡開啟設定“不保留活動”,步驟同case 1

onCreate()    savedInstanceState 此時為null

---- startActivity()

onSaveInstanceState()

onDestory()

---- 從Activity2返回MainActivity

onCreate(Bundle savedInstanceState)  savedInstanceState 此時不為null

---- onRestoreInstance(Bundle savdeInstanceState)

onResume()    

對比case1和 case2的log,觀察到明顯的不同

---- onCreate(Bundle savedInstanceState)  savedInstanceState 此時不為null

---- onRestoreInstance(Bundle savdeInstanceState)

onResume()    

觀察日誌可以得出結論:如果Activity被回收,再次返回它時,onCreate中會有 savedInstatceState物件,並且onRestoreInstance會被呼叫。得出結論後,筆者思路也清晰了,要做的就是在onSaveInstanceState中儲存一個標記,再onCreat中進行標記判斷即可。

筆者不喜歡篇幅過長的技術部落格,這樣會使閱讀者容易疲乏,接下來筆者會整理demo,上傳後在部落格中更新。

參考資料:

http://developer.android.com/reference/android/app/Activity.html

http://blog.csdn.net/liuhe688/article/details/673340

http://blog.csdn.net/android_tutor/article/details/5772285