Android之Activity的生命週期

PS:寫一發關於Activity的生命週期,也算是面試的重點內容.面試

 

學習內容:ide

1.Activity的生命週期函數

2.面對多種狀況的時候Activity的生命週期學習

3.onSaveInstanceState()方法的調用spa

 

1.Activity的生命週期
code

 

  Activity的生命週期是Android中須要掌握的重點部分..也就此簡單的介紹一下..順便本身也捋一捋概念上的東西..對象

返回棧的概念和流程圖:blog

  Android中Activity的管理是由一個棧區進行管理的.在默認狀況下,咱們每次啓動一個新的Activity的時候.他都會在返回棧中入棧.而且處於棧頂的位置.而咱們每次在退出一個Activity的時候,或者是使用finish函數的時候.當前的Activity會進行出棧操做.那麼棧頂位置就成爲了前一個Activity系統老是會將棧頂位置的Activity顯示給用戶.生命週期

 

  這個流程圖就是Activity的管理方式..遊戲

Activity的相關狀態

  i.運行狀態

  運行狀態的Activity.運行狀態的Activity通常都是直接與用戶進行交互的Acticity.也是處於棧頂位置的Activity.系統通常狀況下是不會回收這個Activity的.

  ii.暫停狀態

  暫停狀態的Activity再也不處於棧頂位置,可是仍然處於可見狀態的時候,這個Activity也就進入了暫停狀態.這種的Activity仍是挺常見的.通常咱們在操做一個Activity的時候.好比說系統彈出了一個新的對話框.這個對話框屬於一個新的Activity.可是這個新的Activity並無徹底的覆蓋住了屏幕.那麼原來的那個Activity這個時候就處於了暫停狀態.暫停狀態的Activity系統一版狀態下也是不會主動去回收的.(雖然活動暫停,可是仍然處於可見狀態.若是進行了回收,會使得用戶的體驗性差).可是並不表明任何狀況下都不會被回收.

  iii.中止狀態

  中止狀態的Activity.中止狀態的Activity也再也不處於棧頂位置.而且已經徹底再也不可見了.雖然系統仍然保存着相應的狀態和變量.可是一旦其餘應用也須要使用內存的時候,那麼處於中止狀態下的Activity也就會被系統自動進行回收了.

  iv.銷燬狀態

  通常狀況下Activity在棧區中被移除的時候,Activity也就進入了銷燬狀態.等待系統的回收,釋放資源和內存.

Activity的生存週期

  i.onCreate()方法.

  這個方法在Activity在第一次被建立的時候進行調用.一些相關的初始化操做都在這個方法內部完成.

  ii.OnDestory()

  這個方法是與onCreate()方法是相互對應的.這個方法用於銷燬Activity.釋放資源.

  這兩個方法之間的Activity是一個完整的生存週期

  iii.onStart()

  這個方法使得Activity由不可見狀態成爲可見狀態.

  iv.onStop()

  與onStart()方法造成對應關係.當活動徹底不可見的時候進行調用.

  這兩個個方法之間的Activity是一個可見的生命週期

  v.onResume()

  這個方法表示當前的Activity已經能夠與用戶進行交互了.活動處於棧頂狀態.

  vi.onPause()

  與onResume()方法造成對應關係.這個方法在系統準備去啓動或者恢復另外一個活動的時候調用。咱們一般會在這個方法中將一些消耗CPU 的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度必定要快,否則會影響到新的棧頂活動的使用。(注:onPause()方法調用以後不必定會去調用onStop()方法.取決於新Activity的顯示方式,在下面會作出解釋).

  這兩個方法之間的Activity是一個前臺生存週期,也就是說當前的Activity能夠與用戶進行交互.

  vii.onRestart()

  這個方法的調用是當Activity從中止狀態到運行狀態時須要調用的方法.

  上一張流程圖..

  以上就是關於Activity的生命週期的一個簡單的介紹..下面來看一看相關的實例.

2.面對多種狀況下Activity的生命週期流程

 

  當MainActivity被建立的時候方法的調用過程:

MainActivity的建立會調用的方法:
                onCreate();                 onStart();                 onResume();

   當咱們點擊第一個按鈕的時候,開啓一個新的Activity(咱們稱爲Activity1).當Activity1被建立的時候方法的調用過程是這樣的.

  首先Activity1調用的方法以下:

Activity1的回調方法以下:
             onCreate();
             onStart();
             onResume();
 

   MainActivity的回調方法:

MainActivity被Activity1覆蓋以後回調方法的調用
                            onPause();
                         onStop();                

  這時MainActivity已經執行了上面的一些方法..

 當咱們退出Activity1的時候.MainActivity的執行方法以下:

當咱們退出Activity1.回到MainActivity的時候方法的調用
                            onRestart();
                            onStart();
                            onResume();

  這裏咱們能夠看到onCreate()方法就不會被執行了.這種狀況的前提是咱們手機的內存空間是充足的.

 咱們在來看另一種狀況,好比說咱們開啓了一個應用,而後進入了一個Activity界面中,而後咱們這時點擊了home鍵進行了退出操做,而且沒有清理手機的內存.這個時候咱們去玩手機遊戲,而且這個手機遊戲會佔用至關多的內存空間.而後咱們玩完以後,若是咱們再次返回前一個咱們開啓的那個應用的時候,他仍然會顯示那個Activity的頁面.那麼這個時候這個Activity又執行了哪些方法呢?

 咱們知道手遊是至關耗費內存的.按照上面的那個流程圖來看..若是其餘有優先級的應用須要使用內存空間的時候,而且系統空間並非很足的時候.就須要殺掉進程.釋放那些已經再也不顯示的Activity.也就是處於onStop()狀態的時候.所以當咱們若是再次回到那個應用的Activity的界面的時候.就須要從新調用onCreate()方法對Activity進行從新建立.而後再去執行onStart().onResume()。

 咱們接着看上面的另一種狀況,就是咱們去點擊第二個按鈕的時候,彈出的對話框Activity(這裏稱爲Activity2).咱們來看看這種狀況.當咱們點擊第二個按鈕的時候Activity2的回調方法過程.

Activity2的回調方法:
          onCreate();
          onStart();
          onResume();

  Activity2的建立仍然沒有什麼太大的區別..仍是這三個方法的調用.那麼咱們來看看MainActivity的回到方法:

MainActivity的回調方法:
            onPause();

 這裏咱們能夠看到MainActivity只是調用了一個方法.onPause()方法.並無去調用onStop()方法了.由於MainActivity仍然處於一個可見的狀態.雖然咱們啓動了一個新的Activity,可是Activity2並無徹底的覆蓋MainActivity,所以MainActivity只須要去調用onPause()方法.當咱們點擊回退的時候,MainActivity只會去調用onResume()方法了.

3.onSaveInstanceState()方法

 前面咱們已經說過,當一個活動進入到了中止狀態,是有可能被系統回收的。那麼若是應用中有一個活動A,用戶在活動A的基礎上啓動了活動B,活動A就進入了中止狀態,這個時候因爲系統內存不足,將活動A 回收掉了,而後用戶按下Back 鍵返回活動A,會出現什麼狀況呢?其實仍是會正常顯示活動A的,只不過這時並不會執行onRestart()方法,而是會執行活動A的onCreate()方法,由於活動A 在這種狀況下會被從新建立一次。

 可是這樣會致使的狀況就是,這個新建立的Activity是沒法保存用戶上次輸入的相關信息的.好比說,用戶在一個文本框中輸入了相關內容而後走了上面的狀況.被回收以後,只能從新進行建立,那麼原來用戶在文本框中輸入的相關內容也就不復存在了.這樣就會使得用戶的體驗性較差.那麼咱們如何去記錄用戶上一次的操做的相關信息呢?那麼就是使用onSaveInstanceState()方法了.

 咱們知道Activity建立的時候會調用onCreate()方法.onCreate()方法中存在一個Bundle對象.默認狀況下,這個對象的數據是空的.可是若是咱們須要保存上一次用戶的相關操做,一些數據信息,那麼就須要使用這個對象了.

 咱們只須要這樣..

@Override
protected void onSaveInstanceState(Bundle State) {
    super.onSaveInstanceState(outState);
    String data = "須要保存的數據";
    State.putString("data_key", data);
}

 經過這個方法將數據信息進行保存,那麼恢復的時候就能夠這樣..

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    if (savedInstanceState != null) {
        String data = savedInstanceState.getString("data_key");
    }
    //取出數據以後,在這裏進行恢復.
}

 這樣就能夠經過使用這個方法保存上次用戶輸入的一些數據信息,若是在面對Activity須要從新建立的時候,將數據進行取出,而後從新賦給Activity這樣就可使得用戶上次輸入的數據會得以保存.使得Activity對用戶的體驗更加的良好,,

相關文章
相關標籤/搜索