1. 程式人生 > >Android學習路線(十二)Activity生命周期——啟動一個Activity

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

-c out 方式 下載地址 生命 後臺線程 ring lan debug

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() 方法。而沒有運行其他不論什麽生命周期方法。

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