Activity生命周期
說到activity的生命周期,其實這就跟android的結構一樣,最開始學的時候書上就有寫,但是直到真正入門了,寫過一些程序了才搞得清之前看到的那些是啥意思。
首先是這張經久不衰的圖(反正也是隨手百度來的,水印就不去了)
可以看到,單獨一個activity“從生到死”,所需的過程是onCreate,onStart,onResume,onPause,onStop,onDestroy七個過程
那麽稍微說一下這七個過程,或者說七個方法:
onCreate():
顧名思義,activity創建時,所以這裏需要執行的方法一般是加載布局,控件及一些變量參數的初始化
此時activity在後臺,不可見
onStart():
activity開始時,這裏其實也可以執行初始化工作,不過由於官方推薦及我們自身編程習慣,還是在onCreate裏來進行這些操作
此時activity在後臺,可見
onResume():
activity繼續時,執行到這也標誌著activity成功運行了,一般動畫的初始化應該在這裏進行
此時activity在前臺,可見
onPause():
activity暫停時,一般是由於activity需要切換或者退出,將會執行該方法,該方法可以有0.5秒(超過0.5則會強制關閉activity)的時間來做一些較為輕量的工作,例如數據存儲,去初始化等
此時activity在前臺,可見
onStop():
activity停止時,一般執行資源回收的相關操作,此時activity還在內存中,如果需要的話還可以加載回去
此時activity在後臺,不可見
onDestroy():
activity銷毀時,還是執行資源回收的相關操作,此時activity已經完全被銷毀了,如果需要的話只能重新打開了
此時activity在後臺,不可見
onRestart():
activity重新開始時,當用戶按Home鍵切換到桌面後又切回來或者從後一個Activity切回前一個Activity就會觸發這個方法。這裏一般不做什麽操作。
此時activity在後臺(據我推測),可見
這裏說一下第八個過程
onSaveInstanceState():
保持實例狀態,顧名思義就是保存當前的activity的一些所需要的參數,主要用於在Activity銷毀時保存一些信息,以便下一次切換回來的時候或者打開的時候可以使用這些參數(之後會舉例)
當Activity只執行onPause方法時(Activity a打開一個透明Activity b)這時候如果App設置的targetVersion大於android3.0則不會執行onSaveInstanceState方法。
當Activity執行onStop方法時,通過分析源碼我們知道調用onSaveInstanceState的方法直接傳值為true,所以都會執行onSaveInstanceState方法。
生命周期這麽多,到底有啥意義,有什麽用呢,下面我們舉個例子,走一遍業務邏輯來看一下
public class MainActivity extends Activity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.map); //在activity執行onCreate時執行mMapView.onCreate(savedInstanceState),創建地圖 mMapView.onCreate(savedInstanceState); } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),銷毀地圖 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView.onResume (),重新繪制加載地圖 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView.onPause (),暫停地圖的繪制 mMapView.onPause(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //在activity執行onSaveInstanceState時執行mMapView.onSaveInstanceState (outState),保存地圖當前的狀態 mMapView.onSaveInstanceState(outState); } }
這是高德地圖sdk的使用方法,官方文檔標明了需要在這些生命周期內執行這些方法,那麽我們走一遍流程
首先布局文件被加載——地圖控件初始化——執行定位或其他操作(以定位舉例),這時我們需要高德地圖實現的功能都已經實現了,沒問題,但是當用戶需要切換activity或者結束activity的時候,我們首先執行到onPause,暫停地圖的繼續繪制(用戶都不需要你繼續定位了,就不用實時更新位置了),然後執行onSaveInstanceState,保存用戶目前定位的點,以便下次回來的時候使用,如果關閉的話執行onDestroy,用戶已經不需要這個activity了,地圖控件也可以銷毀了,釋放資源,而如果是activity的切換,當切換回來時,會執行onCreate方法,用之前保存的參數來初始化地圖(也就是打開之後直接顯示上一次結束時的定位點),到這裏看似好像還有一個onResume沒說,但是其實也已經一直在這個循環內作用著,因為地圖的繪制和一些動畫,需要在這裏進行初始化等操作。
最後說一下activity的切換流程
(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop
而不是
(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume
(1)一個Activity或多或少會占有系統資源,而在官方的建議中,onPause方法將會釋放掉很多系統資源,為切換Activity提供流暢性的保障,而不需要再等多兩個階段,這樣做切換更快。
(2)按照生命周期圖的表示,如果用戶在切換Activity的過程中再次切回原Activity,是在onPause方法後直接調用onResume方法的,這樣比onPause→onStop→onRestart→onStart→onResume要快得多。
PS:參考博客:
深入理解Activity的生命周期
Android源碼解析(二十四)-->onSaveInstanceState執行時機
Activity生命周期