天天看點

android 處理生命周期事件

一些Activity可能比另外一些要重要,比如一個打進來的電話比正在玩的遊戲重要;另外,android作為手機系統,記憶體小于桌上型電腦或者筆記本。

有時,目前的Activity可能會發現被關閉,是因為其他Activity需要運作,系統需要目前Activity釋放記憶體資源。可以将這些看做是生命周期,目前的Activity消亡了,其他的則活了。

Activity的狀态

活躍的(active):使用者啟動了Activity,并正在前台運作中;

暫停(pause):使用者啟動了Activity,正在運作,而且可見,但是一個通知或者其他的提示出現在螢幕的最上層,此時可以看到Activity但是不能和它互動。比如有電話進來,使用者可以選擇接聽或者忽略;

停止(stop):使用者啟動了Activity,正在運作,但是因為其他Activity的啟動或者切換而隐藏。這時該activity不能直接操作,除了通過通知;

消亡(dead):activity不在是啟動的,比如電話做了重置(reset),或者activity被終止,比如因為記憶體不夠了。

與activity狀态相關的方法

android系統通過調用一些約定的activity方法,來轉換activity的狀态。

onCreate()方法和onDestroy()方法

onCreate()方法被調用的情況:

當activity第一次被建立的時候,帶null參數;

如果activity已經運作過,後來被kill掉,将調用帶Bundle參數的onCreate()方法,該參數來源于onSaveInstanceState()

當activity處于不同的裝置狀态時,比如從豎顯到橫顯,将會調用onCreate()方法重建activity

onDestroy被調用的情況,即當activity關閉的情況:

activity執行了finish()方法

android需要RAM,可能會緊急關閉activity

需要注意的是,如果記憶體十分緊急,可能不會調用onDestroy方法,而是系統不顧一切的關閉掉,比如來電話的時候。onDestroy()通常用于釋放在onCreate()方法中獲得的資源。

onStart()、onRestart()和onStop()方法

activity在前台執行,可能因為是第一次啟動,或者從隐藏狀态重新帶回前台(比如其他的activity或者來電話)。以上情況都會執行onStart()。

onRestart()方法會在activity已經停止,重新開始的時候調用。

onStop()方法在activity要停止的時候調用。

onPause()和onResume()方法

onResume()方法在activity要前台運作的時候執行,比如第一次初始啟動後,或者從停止(stop)狀态重新開始,或者當一個彈出對話框被清除(比如來電話)。這是重新整理UI的最佳位置,可以在此方法中重新整理視圖,或者調用背景線程更新UI。

相應的,當其他activity奪取了目前activity的控制權後,需要調用目前activity的onPause()方法。在此方法中,應該取消任何在onResume()方法中做的事情。比如關閉背景線程,釋放任何獨占方位的資源(比如攝像頭)。

一旦onPause()方法被調用,android系統将保留對此activity所在程序在任何時刻kill的權利。是以在此狀态下不會可靠的收到将來的事件消息。

對狀态的合理處理

一般情況下,上述方法會處理應用程式通用的事情。比如通過onCreate()方法關聯出最後的UI,通過onPause()方法關閉背景線程。

但有時需要為activity儲存狀态。比如有個電腦程式activity,計算結果後,可能又做了其他事情,使用者回頭想查剛才計算的結果。因為電腦有可能因為記憶體稀缺而關閉。

這時需要使用onSaveInstanceState()方法,android會通過該方法儲存狀态,可以覆寫該方法儲存自己的狀态值到Bundle。

然後通過onCreate()或者onRestoreInstanceState()方法得到Bundle對象執行個體恢複這些自定義狀态。

繼續閱讀