Activity的生命週期詳解(一)

一、啓動與銷燬activity
學習關於activity生命週期的基礎知識,用戶如何啓動應用及執行基本的activity的創建

二、暫停與恢復activity
學習activity暫停發生時,我們應該做哪些事情

三、停止與重啓activity
學習用戶離開activity與返回activity時會發生的事情

四、重新創建activity
學習當我們的activity被銷燬時發生了什麼事情,以及在有必要時如何重建我們的activity。

一、啓動與銷燬activity
不同於其他編程範式(程序從main()方法啓動),Android系統根據生命週期的不同階段喚起對應的回調函數來執行代碼。系統存在啓動與銷燬一個activity的一套有序的回調函數。

本課介紹生命週期中最重要的回調函數,並演示如何處理一個activity所涉及到的回調函數。

1.理解生命週期回調
在一個activity的生命週期中,系統會像金字塔模型一樣去調用一系列的生命週期回調函數。Activity生命週期的每一個階段就像金字塔的臺階。當系統創建了一個新的activity實例,每一個回調函數會向上一階移動activity狀態。處在金字塔頂端意味着當前的activity處在前臺並處於用戶可與其進行交互的狀態。

當用戶退出這個activity時,爲了回收該activity,系統會調用其它方法來向下一階移動activity狀態。在某些情況下,activity會隱藏在金字塔下等待(例如當用戶切換到其它app),此時activity可以重新回到頂端(如果用戶回到這個activity)並恢復用戶離開時的狀態。

這裏寫圖片描述

根據activity的複雜度,也許不需要實現所有的生命週期方法。但瞭解每一個方法的回調時機並在其中填充相應功能,使得確保app能夠像用戶期望的那樣執行是有必要的。
*使用app的時候,不會因爲有來電話或切換到其它app而導致程序crash
*用戶沒有激活某個組件時不會消耗寶貴的系統資源。
*離開app並且一段時間後返回,不會丟失用戶的進度。
*設備發生屏幕旋轉時不會crash或丟失用戶的進度。

其中只有三個狀態是靜態的,這三個狀態下activity可以存在一段比較長的時間。(其他幾個狀態會很快就切換掉,停留的時間比較短暫)

Resumed:該狀態下,activity處在前臺,用戶可以與他進行交互。(running狀態)

Paused: 該狀態下,activity被另外的activity所覆蓋,另外的activity來到前臺,但是半透明的,不會覆蓋整個屏幕。被暫停的activity不再接受用戶的輸入且不再執行任何代碼。

Stopped: 該狀態下,activity完全被隱藏,對用戶不可見。可以認爲是在後臺。當stopped,activity實例與它的所有狀態信息(如成員變量等)都會被保留,但activity不能執行任何代碼。

其他狀態,Created與Started都是短暫的,系統快速的執行那些回調函數並通過執行下一階段回到函數移動到下一個狀態。就是說,系統調用onCreate(),之後迅速調用onStart(),之後再迅速執行onResume(),

2.指定程序首次啓動的Activity
當用戶從主界面點擊程序圖標時,系統會調用app中被聲明爲launcher(or main) activity中的onCreate()方法。這個activity被用作程序的主要進入點。

我們可以在AndroidManifest.xml中定義作爲主activity的activity。

這個main activity必須在manifest使用包括 MAIN action 與LAUNCHER category的標籤來聲明

<activity  android:name=".MainActivity"
  android:label="@string/app_name"> 
  <intent-filter>
     <action android:name="android.intent.action.MAIN" />                                           
     <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

Note:當你使用Android SDK工具來創建Android工程時,工程中就包含了一個默認的聲明有這個filter的activity類。

如果程序中沒有聲明瞭MAIN action 或者LAUNCHER category的activity,那麼在設備的主界面列表裏面不會呈現app圖標。

3、創建一個新的實例
大多數app包括多個activity,使用戶可以執行不同的動作。不論這個activity是當用戶點擊應用圖標創建的main activity還是爲了響應用戶行爲而創建的其他activity,系統都會調用新activity實例中的onCreate()方法。

我們實現onCreate()方法來執行程序啓動所需要的基本邏輯。例如可以在onCreate()方法中定義UI以及實例化類成員變量。

下面onCreate()方法演示爲了建立一個activity所需要的一些基礎操作。如聲明UI元素,定義成員變量,配置UI等。(onCreate裏面儘量少做事情,避免程序啓動太久都看不到界面)

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);

    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);

    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

Caution:用SDK_INT來避免舊的系統調用了只在Android 2.0(API level 5)或者更新的系統可用的方法(上述if條件中的代碼)。舊的系統調用了這些方法會拋出一個運行時異常。

一旦 onCreate操作完成,系統會迅速調用onStart()與onResume()方法。我們的activity不會在Created或者Started狀態停留。技術上來說,activity在onStart()被調用後開始被用戶可見,但是onResume會迅速被執行使得activity停留在Resumed狀態,知道一些因素髮生變化纔回改變這個狀態。例如接收到一個來電,用戶切換到另一個activity,或屏幕關閉。

在後面的課程中,我們將看到其他方法是如何使用的,onStart() 與 onResume()在用戶從Paused或Stopped狀態中恢復的時候非常有用。
Note: onCreate() 方法包含了一個參數叫做savedInstanceState,這將會在後面的課程 - 重新創建activity涉及到。
這裏寫圖片描述

Figure 2. 上圖顯示了onCreate(), onStart() 和 onResume()是如何執行的。當這三個順序執行的回調函數完成後,activity會到達Resumed狀態。

4.銷燬Activity

activity的第一個生命週期回調函數是onCreate(),它最後一個回調的是onDestroy(), 當收到需要將該activity徹底移除的信號時,系統會調用這個方法。

大多數app並不需要實現這個方法,因爲局部類的references會隨着activity銷燬而銷燬,並且我們的activity應該在onPause()與onStop()中執行清除activity資源的操作。然而,如果activity含有在onCreate調用時創建的後臺線程,或其他有可能導致內存泄漏的資源,則應該在onDestoy()時進行資源清理,殺死後臺線程。

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

Note: 除非程序在onCreate()方法裏面就調用了finish()方法,系統通常是在執行了onPause()與onStop()之後再調用onDestroy().在某些情況下,例如我們的activity知識做了一個臨時的邏輯跳轉的功能,他只是用來決定跳轉到拿一個activity,這樣的話,需要在onCreate裏面調用finish方法,這樣系統會直接調用onDestroy跳過生命週期中的其他方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章