Android學習路線(十二)Activity生命週期——啓動一個Activity

DEMO下載地址:http://download.csdn.net/detail/sweetvvck/7728735

不像其它的編程模式那樣應用是通過main()函數啓動的,Android系統通過調用特定的回調方法對應着特定的生命週期階段,來初始化一個Activity 實例中的代碼。有一系列的方法來啓動一個activity,同時也有一系列的方法來銷燬activity。

本課展示了大多數重要生命週期方法的預覽,並且告訴你如何處理第一個生命週期方法來創建一個新的activity實例。

理解生命週期方法


在activity的一生中,系統按照類似金字塔的次序調用核心生命週期方法。就像這樣,activity生命週期的每個階段就是金字塔的每個臺階。當系統創建一個新的activity,每個回調方法將activity的狀態向頂端移動一步。金字塔的頂端對應着運行在應用前臺的activity,這時用戶能夠與它交互。

當用戶準備離開這個activity時,系統會調用另外一些方法來將activity的狀態向金字塔下移動,從而銷燬這個activity。在一些情況下,activity只會向下移動一半然後等待(例如用戶切換到其他的應用中),這樣這個activity就可以再次出現到頂部(如果用戶回到這個activity)同時恢復用戶離開時的狀態。

圖 1. 一個簡單的android聲明週期插圖,像一個金字塔的樣子展現。它展示了每個方法被調用後是如何帶着activity到達金字塔的頂部Resumed狀態的,同樣也有方法讓activity下一級臺階。這個activity在被Paused和Stopped狀態下同樣也能再次回到Resumed狀態。

由於這些的複雜性,你並不需要實現所有的生命週期方法。然而,你要確保你的應用會像用戶期待的那樣表現,理解和實現每個方法是十分重要的。適當地實現activity的生命週期方法可以通過幾種方式來保證你的應用表現得很好,包括下面幾點:

  • 當用戶在使用你的應用時接到電話或者切換到其它應用時不要崩潰。
  • 當用戶沒有在使用你的activity時不要消耗珍貴的系統資源。
  • 如果用戶離開你的應用然後過一段時間返回來後不要丟失用戶的進度。
  • 屏幕橫豎屏切換時不要丟失用戶的進度更不要崩潰。

你將會在接下來的課程中學到,activity像插圖1那樣在不同狀態下切換有多種情況。然而,它們之中只有三種狀態是靜態的。就像這樣,activity可以在這三種狀態之一中保存一段較長時間:

Resumed
在這個狀態下,activity是在前臺的,用戶能夠跟它進行交互。(有時候也被稱爲"running" 狀態。)
Paused
在這個狀態下,activity被另一個activity遮住了一部分——這裏指的另一個activity是半透明的或者沒有覆蓋整個屏幕。處於paused狀態的activity不能接收任何用戶輸入也不能執行任何代碼。
Stopped
在這個狀態下, 這個activity被完全地隱藏了;可以理解爲在後臺。在stopped過程中,activity實例以及它的所有狀態信息例如成員變量都被保存起來了,但是它不能執行任何代碼。

其他的狀態(Created 和 Started)是瞬時狀態,系統會在調用下一個生命週期方法來讓此狀態轉移到下一個狀態。就這樣,當系統調用onCreate(),它馬上會調用onStart()方法,他後面很快被接着onResume()方法。

上面就是基本的activity的生命週期方法。現在你將要開始學習一些特定的生命週期方法的行爲。

指定你的應用的啓動Activity


當用戶在設備主界面選擇你的應用圖標時,系統會調用onCreate() 方法,它是你聲明作爲應用啓動Activity 中的方法。它是一個作爲進入應用UI的入口activity。

你可以在manifest中定義哪個activity作爲應用啓動的activity,在項目根目錄下的AndroidManifest.xml文件。

這個你應用的主activity必須在manifest 文件中聲明<intent-filter> 元素,同時該元素要包含MAINaction 和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>

提示: 當你通過Android SDK工具創建一個新的Android項目時,默認的項目文件會包含這個Activity 並且已經聲明好了這個filter。

如果在你的所有activity中,MAIN action 或者 LAUNCHER category 都沒有被聲明,那麼你的應用的icon將不會出現在設備的主界面上。

創建一個新的實例


大多數的應用都包含幾個不同的activity,讓用戶執行允許用戶執行不同的錯啊做。不管這個activity是不是當點擊應用圖標時被創建的主activity還是響應用戶操作開啓的activity,系統都會通過調用它的onCreate()方法爲每個activity創建實例。

你必須實現onCreate() 方法來執行基本的應用啓動邏輯,這在應用的整個生命週期中只會出現一次。例如,你對onCreate() 方法的實現中需要定義UI以及實例化一些可能存在的類變量。

例如,下面的 onCreate() 方法的例子展示了一些執行activity基本的啓動代碼,例如聲明UI(在一個XML文件中被定義),定義成員變量,以及配置一些UI。

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);
    }
}

注意: 使用SDK_INT 來阻止老系統執行新的APIs。老版本的系統執行新APIs將會導致一個運行時異常。

一旦onCreate() 結束執行,系統會很快調用onStart() 方法和onResume() 方法。你的activity絕不會停留在Created或者Started狀態下。從技術角度來看,當onStart()方法被調用時,這個activity對用戶可見了,但是緊接着 onResume() 方法被調用後這個activity會一直保持在Resumed狀態下,直到一些事情改變了它們,例如當來了一個電話時,用戶導航到其他的activity上,或者設備的屏幕被關閉。

在接下來的課程裏,你將會看到其它的方法,onStart() 和onResume() 在被用來resume來自Pasued或者Stopped狀態下的activity是如何起作用的。

提示: onCreate() 方法包含了一個被稱爲savedInstanceState 的參數,這個參數將會在後邊的課程中介紹:Recreating an Activity

圖 2. 另一個activity聲明週期結構的插圖,在系統創建一個activity的新實例時所調用的回調方法(onCreate()onStart(), 和onResume())被強調出來。一旦這個回調序列結束,activity將會處於Resumed狀態直到他們切換到另一個activity中。

銷燬Activity


Activity的第一個回調方法是onCreate(),它的最後一個回調方法是onDestroy()。系統會在你的activity中調用這個方法最爲結束信號,你的activity實例將會從系統內存中完全移除。

大多數的應用不需要實現這個方法,因爲本地的類引用將會和activity一起被銷燬,並且你的activity在onPause() 和onStop()方法中需要執行大部分的清理工作。然而,如果你的activity包含在onCreate()方法中創建的後臺線程或者其他長時間運行的資源,如果沒有適當地關閉,那麼你需要在onDestroy()方法中銷燬它們。

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass
    
    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

提示: 系統在所有的情況下都會在執行完onPause() 和onStop() 後調用onDestroy()方法,除了一個例外:當你在onCreate()方法中調用了finish() 方法。這一些情況下,例如你的activity被用來做臨時的跳轉,你需要在onCreate()方法中調用finish() 來銷燬這個activity。在這種情況下,系統立刻就執行了onDestroy() 方法,而沒有執行其它任何生命週期方法。

發佈了44 篇原創文章 · 獲贊 7 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章