天天看點

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對象執行個體恢複這些自定義狀态。