Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android編程入門 >> Android之Activity的生命周期

Android之Activity的生命周期

編輯:Android編程入門

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

 

學習內容:

1.Activity的生命周期

2.面對多種情況的時候Activity的生命周期

3.onSaveInstanceState()方法的調用

 

1.Activity的生命周期

 

  Activity的生命周期是Android中需要掌握的重點部分..也就此簡單的介紹一下..順便自己也捋一捋概念上的東西..

返回棧的概念和流程圖:

  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對用戶的體驗更加的良好,,

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved