【Android介面實現】Starting an Activity(Activity生命週期金字塔模型)

來源:互聯網
上載者:User

標籤:android   生命週期   

    轉載請註明:http://blog.csdn.net/zhaokaiqiang1992

    本文翻譯自http://developer.android.com/training/basics/activity-lifecycle/starting.html ,大家可以去看原文。

    Android並不象其他的程式,它不是從main()函數開始載入的,Android系統是通過在不同的時期調用生命週期的對應回調方法完成代碼的初始化的。所以如果要瞭解Android程式,就必須瞭解啟動順序和銷毀順序。

    這一節課程我們將學習非常重要的生命週期方法,並展示給你如何控制生命週期的回調方法來初始化一個Activity執行個體。


    瞭解生命週期的回調方法

    在一個Activity的存在過程中,系統會按照一定的順序,調用一個”金字塔“形狀的生命週期方法模型。Activity的生命週期的每一個階段,都是金字塔模型的一個單獨的步驟。當系統建立一個Activity的執行個體的時候,每一個回調方法都推動著Activity的狀態一步步的往前發展。在”金字塔“的最上端的狀態,是Activity可以一直存在與視窗最前端,並且可以和使用者進行互動的狀態值。

    當使用者離開Activity之後,系統會調用其他的方法把Activity的狀態從"金字塔”的塔尖上推下來,這樣Activity才能夠被銷毀。在有些情況下,Activity只會在塔尖向下移動一點,然後就停在那個狀態值了,比如說使用者開啟了另外一個APP;當使用者再次回到我們的APP的時候,狀態值又會回到塔尖狀態,恢複到使用者離開前的狀態。



    上面這個圖就是Activity生命週期的金字塔模型,從上面這個模型中,我們可以清楚的看出Activity的狀態值的變化和轉換。當程式調用onStart之後,Activity對使用者來說就是可以見的了,之後調用onResume,Activity便一直停留在Resumed狀態,這應該是Activity可以與使用者正常互動的狀態。在這之後,如果Activity被部分遮擋,Activity的onPause方法會被調用,然後Activity進入Paused狀態,這個時候Activity的介面對使用者來說是部分可見的。如果遮擋部分離開介面,那麼Activity就又回到了Resumed狀態,恢複到使用者離開前的狀態。如果Activity的介面完全的被一個Activity遮擋之後,那麼Activity的onStop方法會被調用,Activity介面對使用者來說完全不可見,即不可互動狀態,這個時候進入Stopped狀態,如果記憶體不夠用,那麼這個Activity很有可能被記憶體回收器回收掉。但是,如果在被回收之前,使用者又回到了這個Activity,那麼程式會從Stopped狀態,調用onRestart、onStart、onResume方法,進入到Resumed狀態,恢複到使用者離開前的狀態。

    根據我們的業務需求,這些生命週期的回調方法並不一定全部重寫,然而,你理解每個生命週期方法,並且保證你的軟體能夠和你使用者所想的行為運行,這是非常重要的。實現生命週期方法,並且讓你的軟體運行良好,主要有以下幾個方面:

    (1)當使用者接到一個電話或者是選擇另外一個APP的時候,保證你的APP不會crash掉

    (2)當使用者不積極的使用時,不要耗費寶貴的系統資源

    (3)當使用者離開然後在一段時間之後返回時,不要丟失使用者的進度

    (4)當螢幕的方向發生變化的時候,不要丟失使用者的進度或者是crash掉

    在接下你將學習Activity的不同狀態之間的轉換,然後,只有三種狀態,Activity可以一直保持:

    Resumed:在這種狀態下,Activity的介面可以與使用者進行互動,並處於手機視窗的最前端。

    Paused:當Activity被部分遮擋,比如彈出一個dialog的時候,進入這種狀態,在這種狀態的Activity不能接受使用者輸入,也不能執行任何代碼

    Stopped:當Activity完全不能被使用者可見的時候,即可進入這種狀態。在這種狀態下,Activity和它的狀態資訊,比如說是成員變數都被保留,但是代碼不能繼續執行了。

    其他的狀態,比如說Created或者是Started,會由於生命週期的回調方法而快速的轉換到其他的狀態,不能被保持。因此,在調用onCreate之後,會很快的調用onStart和onResume。

    上面這些都是一些比較基礎的關於Activity生命週期的介紹,下面,我們將介紹一些比較特殊的情況。


    設定App的載入Activity

    當使用者在案頭上點擊我們的APP的表徵圖的時候,系統會調用我們設定成啟動Activity的onCreate方法完成程式的啟動,這個Activity是我們的APP的使用者介面入口。

    我們可以通過設定androidManifest.xml檔案來定義啟動Activity。程式的主Activity必須聲明一個帶有MAIN動作和LAUNCHER分類的<intent-ilter>,就像下面這樣:

<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>
    注意:當我們使用開發工具建立好一個工程之後,主載入Activity已經設定好了。

    如果我們的APP沒有一個主Activity,那麼在使用者的Home介面的程式列表中將沒有我們APP的表徵圖。


    建立一個新的執行個體

    很多APP都有很多的Activity來完成不同的功能,不管Activity是主Activity還是其他的Activity,完成Activity的初始化工作都是在oncreate方法裡面進行的。我們必須重寫onCreate方法,並在裡面完成只需要進行一次的初始化操作,比如說聲明使用者介面,聲明成員變數等操作。

TextView mTextView; // Member variable for text view in the layout@Overridepublic 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);    }}

    一旦onCreate結束執行之後,系統會馬上調用onStart、onResume方法,Activity永遠不會停留在Started和Created狀態。當onStrat調用之後,介面此時對使用者就可見了,然後馬上調用onResume當法,並停留在Resumed狀態,一直到有操作打斷這種狀態,比如說有電話打入。使用者導航去其他的介面等。

    在接下來的其他的課程中,你將會明白在Activity的生命週期中,onStart和onResume方法對於從Paused和Stopped狀態中恢複是多麼的重要。



    銷毀Activity

    在Activity的生命週期中,最先執行的操作是onCreate,最後執行的操作是onDestory,當這個方法調用的時候,就意味著你的Activity已經被完全的從記憶體中清除掉了。很多的APP不需要實現這個方法,這是因為本地的類引用被銷毀了,並且在onPause和onStop方法中應該完成了大多數的清理工作。但是,如果你的程式中存在在後台啟動並執行線程或者是如果不正確的關閉會造成記憶體流失的資源引用,那麼在onDestory方法中,你應該幹掉他們。

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

    注意:在大多數情況下,系統會在onPause和onStop方法之後調用onDestory,但是如果在onCreate中直接調用onDestory的話,系統會立即調用onDestory,而不會調用他之前的那些生命週期中的回調方法。

【Android介面實現】Starting an Activity(Activity生命週期金字塔模型)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.