1. 程式人生 > >Activity生命周期

Activity生命周期

編程 ans 做什麽 cte oid 多系統 start void 回來

  說到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生命周期