標籤:view 需要 class 避免 strong dma ons 期望 其他應用
當使用者導航、退出和返回您的應用時,應用中的 Activity 執行個體將在其生命週期中轉換不同狀態。 例如,當您的Activity初次開始時,它將出現在系統前台並接收使用者焦點。 在這個過程中,Android 系統會對Activity調用一系列生命週期方法,通過這些方法,您可以設定使用者介面和其他組件。 如果使用者執行開始另一Activity或切換至另一應用的操作,當其進入後台(在其中Activity不再可見,但執行個體及其狀態完整保留),系統會對您的Activity調用另外一系列生命週期方法。
在生命週期回調方法內,您可以聲明使用者離開和再次進入Activity時的Activity行為。比如,如果您正構建流視頻播放器,當使用者切換至另一應用時,您可能要暫停視頻或終止網路連接。當使用者返回時,您可以重新串連網路並允許使用者從同一位置繼續播放視頻。
本課講述每個 Activity 執行個體接收的重要生命週期回調方法以及您如何使用這些方法以使您的Activity按照使用者預期進行並且當您的Activity不需要它們時不會消耗系統資源。
啟動與銷毀Activity
不同於使用 main()
方法啟動應用的其他編程範例,Android 系統會通過調用對應於其生命週期中特定階段的特定回調方法在 Activity 執行個體中啟動代碼。 有一系列可啟動Activity的回調方法,以及一系列可分解Activity的回調方法。
本課程概述了最重要的生命週期方法,並向您展示如何處理建立Activity新執行個體的第一個生命週期回調。
瞭解生命週期回調
在Activity的生命週期中,系統會按類似於階梯金字塔的順序調用一組核心的生命週期方法。也就是說,Activity生命週期的每個階段就是金字塔上的一階。 當系統建立新Activity執行個體時,每個回調方法會將Activity狀態向頂端移動一階。金字塔的頂端是Activity在前台運行並且使用者可以與其互動的時間點。
當使用者開始離開Activity時,系統會調用其他方法在金字塔中將Activity狀態下移,從而銷毀Activity。在有些情況下,Activity將只在金字塔中部分下移並等待(比如,當使用者切換到其他應用時),Activity可從該點開始移回頂端(如果使用者返回到該Activity),並在使用者停止的位置繼續。
圖 1.簡化的Activity生命週期圖示,以階梯金字塔表示。此圖示顯示,對於用於將Activity朝頂端的“繼續”狀態移動一階的每個回調,有一種將Activity下移一階的回調方法。Activity還可以從“暫停”和“停止”狀態回到繼續狀態。*
根據Activity的複雜程度,您可能不需要實現所有生命週期方法。但是,瞭解每個方法並實現確保您的應用按照使用者期望的方式啟動並執行方法非常重要。正確實現您的Activity生命週期方法可確保您的應用按照以下幾種方式良好運行,包括:
- 如果使用者在使用您的應用時接聽來電或切換到另一個應用,它不會崩潰。
- 在使用者未主動使用它時不會消耗寶貴的系統資源。
- 如果使用者離開您的應用並稍後返回,不會丟失使用者的進度。
- 當螢幕在橫向和縱向之間旋轉時,不會崩潰或丟失使用者的進度。
正如您將要在以下課程中要學習的,有Activity會在圖 1 所示不同狀態之間過渡的幾種情況。但是,這些狀態中只有三種可以是靜態。 也就是說,Activity只能在三種狀態之一下存在很長時間。
- Resumed:在這種狀態下,Activity處於前台,且使用者可以與其互動。(有時也稱為“運行”狀態。)
- Paused:在這種狀態下,Activity被在前台中處於半透明狀態或者未覆蓋整個螢幕的另一個Activity—部分阻擋。暫停Activity不會接收使用者輸入並且無法執行任何代碼。
- Stopped:在這種狀態下,Activity被完全隱藏並且對使用者不可見;它被視為處於後台。停止時,Activity執行個體及其諸如成員變數等所有狀態資訊將保留,但它無法執行任何代碼。
其他狀態(“建立”和“開始”)是瞬態,
其它狀態 (Created與Started)都是短暫的瞬態,系統會通過調用下一個生命週期回調方法從這些狀態快速移到下一個狀態。 也就是說,在系統調用 onCreate()) 之後,它會快速調用 onStart()),緊接著快速調用 onResume())。
基本生命週期部分到此為止。現在,您將開始學習特定生命週期行為的一些知識。
指定程式初次開機的Activity
當使用者從主介面點擊程式表徵圖時,系統會調用app中被聲明為"launcher" (or "main") activity中的onCreate()方法。這個Activity被用來當作程式的主要進入點。
我們可以在AndroidManifest.xml中定義作為主activity的activity。
這個main activity必須在manifest使用包括 MAIN
action 與 LAUNCHER
category 的<intent-filter>
標籤來聲明。例如:
<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表徵圖。
建立一個新的執行個體
大多數app包括多個activity,使使用者可以執行不同的動作。不論這個activity是當使用者點擊應用表徵圖建立的main activtiy還是為了響應使用者行為而建立的其他activity,系統都會調用新activity執行個體中的onCreate()方法。
我們必須實現onCreate()方法來執行程式啟動所需要的基本邏輯。例如可以在onCreate()方法中定義UI以及執行個體化類成員變數。
例如:下面的onCreate()方法示範了為了建立一個activity所需要的一些基礎操作。如聲明UI元素,定義成員變數,配置UI等。(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); }}
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狀態。
銷毀Activity
activity的第一個生命週期回呼函數是 onCreate(),它最後一個回調是onDestroy().當收到需要將該activity徹底移除的訊號時,系統會調用這個方法。
大多數 app並不需要實現這個方法,因為局部類的references會隨著activity的銷毀而銷毀,並且我們的activity應該在onPause()與onStop()中執行清除activity資源的操作。然而,如果activity含有在onCreate調用時建立的後台線程,或者是其他有可能導致記憶體流失的資源,則應該在OnDestroy()時進行資源清理,殺死後台線程。
@Overridepublic 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方法,這樣系統會直接調用onDestory,跳過生命週期中的其他方法。
6) 十分鐘學會android--Activity的生命週期之啟動與銷毀