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