Android啟動(dòng)與銷毀Activity

2018-08-02 18:33 更新

編寫:kesenhoo - 原文:http://developer.android.com/training/basics/activity-lifecycle/starting.html

不同于使用 main() 方法啟動(dòng)應(yīng)用的其他編程范例,Android 系統(tǒng)會(huì)通過調(diào)用對(duì)應(yīng)于其生命周期中特定階段的特定回調(diào)方法在 Activity 實(shí)例中啟動(dòng)代碼。 有一系列可啟動(dòng)Activity的回調(diào)方法,以及一系列可分解Activity的回調(diào)方法。

本課程概述了最重要的生命周期方法,并向您展示如何處理創(chuàng)建Activity新實(shí)例的第一個(gè)生命周期回調(diào)。

了解生命周期回調(diào)

在Activity的生命周期中,系統(tǒng)會(huì)按類似于階梯金字塔的順序調(diào)用一組核心的生命周期方法。也就是說,Activity生命周期的每個(gè)階段就是金字塔上的一階。 當(dāng)系統(tǒng)創(chuàng)建新Activity實(shí)例時(shí),每個(gè)回調(diào)方法會(huì)將Activity狀態(tài)向頂端移動(dòng)一階。金字塔的頂端是Activity在前臺(tái)運(yùn)行并且用戶可以與其交互的時(shí)間點(diǎn)。

當(dāng)用戶開始離開Activity時(shí),系統(tǒng)會(huì)調(diào)用其他方法在金字塔中將Activity狀態(tài)下移,從而銷毀Activity。在有些情況下,Activity將只在金字塔中部分下移并等待(比如,當(dāng)用戶切換到其他應(yīng)用時(shí)),Activity可從該點(diǎn)開始移回頂端(如果用戶返回到該Activity),并在用戶停止的位置繼續(xù)。

basic-lifecycle

圖 1.簡(jiǎn)化的Activity生命周期圖示,以階梯金字塔表示。此圖示顯示,對(duì)于用于將Activity朝頂端的“繼續(xù)”狀態(tài)移動(dòng)一階的每個(gè)回調(diào),有一種將Activity下移一階的回調(diào)方法。Activity還可以從“暫?!焙汀巴V埂睜顟B(tài)回到繼續(xù)狀態(tài)。*

根據(jù)Activity的復(fù)雜程度,您可能不需要實(shí)現(xiàn)所有生命周期方法。但是,了解每個(gè)方法并實(shí)現(xiàn)確保您的應(yīng)用按照用戶期望的方式運(yùn)行的方法非常重要。正確實(shí)現(xiàn)您的Activity生命周期方法可確保您的應(yīng)用按照以下幾種方式良好運(yùn)行,包括:

  • 如果用戶在使用您的應(yīng)用時(shí)接聽來電或切換到另一個(gè)應(yīng)用,它不會(huì)崩潰。
  • 在用戶未主動(dòng)使用它時(shí)不會(huì)消耗寶貴的系統(tǒng)資源。
  • 如果用戶離開您的應(yīng)用并稍后返回,不會(huì)丟失用戶的進(jìn)度。
  • 當(dāng)屏幕在橫向和縱向之間旋轉(zhuǎn)時(shí),不會(huì)崩潰或丟失用戶的進(jìn)度。

正如您將要在以下課程中要學(xué)習(xí)的,有Activity會(huì)在圖 1 所示不同狀態(tài)之間過渡的幾種情況。但是,這些狀態(tài)中只有三種可以是靜態(tài)。 也就是說,Activity只能在三種狀態(tài)之一下存在很長(zhǎng)時(shí)間。

  • Resumed:在這種狀態(tài)下,Activity處于前臺(tái),且用戶可以與其交互。(有時(shí)也稱為“運(yùn)行”狀態(tài)。)
  • Paused:在這種狀態(tài)下,Activity被在前臺(tái)中處于半透明狀態(tài)或者未覆蓋整個(gè)屏幕的另一個(gè)Activity—部分阻擋。暫停的Activity不會(huì)接收用戶輸入并且無法執(zhí)行任何代碼。
  • Stopped:在這種狀態(tài)下,Activity被完全隱藏并且對(duì)用戶不可見;它被視為處于后臺(tái)。停止時(shí),Activity實(shí)例及其諸如成員變量等所有狀態(tài)信息將保留,但它無法執(zhí)行任何代碼。

其他狀態(tài)(“創(chuàng)建”和“開始”)是瞬態(tài),

其它狀態(tài) (CreatedStarted)都是短暫的瞬態(tài),系統(tǒng)會(huì)通過調(diào)用下一個(gè)生命周期回調(diào)方法從這些狀態(tài)快速移到下一個(gè)狀態(tài)。 也就是說,在系統(tǒng)調(diào)用 onCreate()) 之后,它會(huì)快速調(diào)用 onStart()),緊接著快速調(diào)用 onResume())。

基本生命周期部分到此為止?,F(xiàn)在,您將開始學(xué)習(xí)特定生命周期行為的一些知識(shí)。

指定程序首次啟動(dòng)的Activity

當(dāng)用戶從主界面點(diǎn)擊程序圖標(biāo)時(shí),系統(tǒng)會(huì)調(diào)用app中被聲明為"launcher" (or "main") activity中的onCreate()方法。這個(gè)Activity被用來當(dāng)作程序的主要進(jìn)入點(diǎn)。

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

這個(gè)main activity必須在manifest使用包括 MAIN action 與 LAUNCHER category 的<intent-filter>標(biāo)簽來聲明。例如:

<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:當(dāng)你使用Android SDK工具來創(chuàng)建Android工程時(shí),工程中就包含了一個(gè)默認(rèn)的聲明有這個(gè)filter的activity類。

如果程序中沒有聲明了MAIN action 或者LAUNCHER category的activity,那么在設(shè)備的主界面列表里面不會(huì)呈現(xiàn)app圖標(biāo)。

創(chuàng)建一個(gè)新的實(shí)例

大多數(shù)app包括多個(gè)activity,使用戶可以執(zhí)行不同的動(dòng)作。不論這個(gè)activity是當(dāng)用戶點(diǎn)擊應(yīng)用圖標(biāo)創(chuàng)建的main activtiy還是為了響應(yīng)用戶行為而創(chuàng)建的其他activity,系統(tǒng)都會(huì)調(diào)用新activity實(shí)例中的onCreate()方法。

我們必須實(shí)現(xiàn)onCreate()方法來執(zhí)行程序啟動(dòng)所需要的基本邏輯。例如可以在onCreate()方法中定義UI以及實(shí)例化類成員變量。

例如:下面的onCreate()方法演示了為了建立一個(gè)activity所需要的一些基礎(chǔ)操作。如聲明UI元素,定義成員變量,配置UI等。(onCreate里面盡量少做事情,避免程序啟動(dòng)太久都看不到界面)

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來避免舊的系統(tǒng)調(diào)用了只在Android 2.0(API level 5)或者更新的系統(tǒng)可用的方法(上述if條件中的代碼)。舊的系統(tǒng)調(diào)用了這些方法會(huì)拋出一個(gè)運(yùn)行時(shí)異常。

一旦onCreate 操作完成,系統(tǒng)會(huì)迅速調(diào)用onStart() 與onResume()方法。我們的activity不會(huì)在Created或者Started狀態(tài)停留。技術(shù)上來說, activity在onStart()被調(diào)用后開始被用戶可見,但是 onResume()會(huì)迅速被執(zhí)行使得activity停留在Resumed狀態(tài),直到一些因素發(fā)生變化才會(huì)改變這個(gè)狀態(tài)。例如接收到一個(gè)來電,用戶切換到另外一個(gè)activity,或者是設(shè)備屏幕關(guān)閉。

在后面的課程中,我們將看到其他方法是如何使用的,onStart() 與 onResume()在用戶從Paused或Stopped狀態(tài)中恢復(fù)的時(shí)候非常有用。

Note: onCreate() 方法包含了一個(gè)參數(shù)叫做savedInstanceState,這將會(huì)在后面的課程 - 重新創(chuàng)建activity涉及到。

basic_lifecycle-create

Figure 2. 上圖顯示了onCreate(), onStart() 和 onResume()是如何執(zhí)行的。當(dāng)這三個(gè)順序執(zhí)行的回調(diào)函數(shù)完成后,activity會(huì)到達(dá)Resumed狀態(tài)。

銷毀Activity

activity的第一個(gè)生命周期回調(diào)函數(shù)是 onCreate(),它最后一個(gè)回調(diào)是onDestroy().當(dāng)收到需要將該activity徹底移除的信號(hào)時(shí),系統(tǒng)會(huì)調(diào)用這個(gè)方法。

大多數(shù) app并不需要實(shí)現(xiàn)這個(gè)方法,因?yàn)榫植款惖膔eferences會(huì)隨著activity的銷毀而銷毀,并且我們的activity應(yīng)該在onPause()與onStop()中執(zhí)行清除activity資源的操作。然而,如果activity含有在onCreate調(diào)用時(shí)創(chuàng)建的后臺(tái)線程,或者是其他有可能導(dǎo)致內(nèi)存泄漏的資源,則應(yīng)該在OnDestroy()時(shí)進(jìn)行資源清理,殺死后臺(tái)線程。

@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()方法里面就調(diào)用了finish()方法,系統(tǒng)通常是在執(zhí)行了onPause()與onStop() 之后再調(diào)用onDestroy() 。在某些情況下,例如我們的activity只是做了一個(gè)臨時(shí)的邏輯跳轉(zhuǎn)的功能,它只是用來決定跳轉(zhuǎn)到哪一個(gè)activity,這樣的話,需要在onCreate里面調(diào)用finish方法,這樣系統(tǒng)會(huì)直接調(diào)用onDestory,跳過生命周期中的其他方法。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)