1.主要內容
本小節首先對Activity的各個生命週期作簡單介紹,然後介紹如何設定Main Activity,最後講解建立和銷毀Activity。
2.視頻講解
http://www.eyeandroid.com/thread-11253-1-1.html
3.翻譯參考
啟動Activity
與其他在應用程式中由main()函數作為開端不同,Android系統的啟動代碼是在一個Activity的執行個體通過調用對應其生命週期的特定階段的特定回調方法中進行。
其中有一系列的方法來啟動Activity,也有一系列的方法來登出一個Activity。這次的教學內容,將會描述生命週期中最重要的函數方法,並向你展示如何在建立你的Activity執行個體時處理首要生命週期回呼函數。
瞭解生命週期回呼函數
在Activity的整個生命中,系統按順序地調用一系列的像金字塔般的生命週期函數。也就是說,每個階段的活動是金字塔中單獨的一個步驟。當系統建立了一個新的Activity執行個體,每調用一個函數,就會往金字塔頂端走一步。而金字塔最頂端的狀態(Resumed狀態)就是Activity正在前台運行而且使用者正與其互動的狀態。當使用者開始離開Activity,系統就會調用其他的方法,使Activity的狀態往金字塔的低端走,並逐步去除Activity。
在某些條件下,Activity只會往低端走一小步並在該處等待(例如使用者轉去了其他應用程式),而在該處Activity也可以重新回到頂端(當使用者返回到原Activity)並恢複到原來的狀態。
圖1。Activity生命週期的簡化圖,就像一個階梯金字塔。這映像表明每個狀態中是怎麼樣使用回呼函數使得恢複狀態回到頂端,或者降低狀態到達底部。Activity可以從Paused狀態和stopped狀態恢複到Resumed狀態。根據你的Activity的複雜程度,你可能不需要使用全部的生命週期函數。然而,去認識每一個周期函數並使用它們去保證滿足使用者的期望是非常重要的。
正確使用你的Activity生命週期函數去保障應用程式的良好表現,必須注意很多方面,包括下面的內容:
當使用者電話中或者轉去另外一個應用程式時,不要讓程式崩潰。
當使用者沒有啟用使用它時,不消耗寶貴的系統資源。
當使用者離開你的應用程式並在稍後的時間返回,不會丟失使用者的進度。
當使用者螢幕在橫向與縱向旋轉切換時,不會崩潰或者丟失使用者進度。
Resumed狀態
在這種狀態下,該Activity在前台運行,使用者可以與它進行互動。(有時也簡稱為“running”狀態。)
Paused狀態
在這種狀態下,該Activity被部分遮蔽(被其他在前台的半透明或不覆蓋整個螢幕的活動遮住)。此狀態不接受使用者輸入,並且不能執行任何代碼。
Stopped狀態
在這種狀態下,該活動是完全隱藏,不可見的,它被認為是在後台。雖然停止,活動執行個體和所有成員變數如狀態資訊將被保留,但不能執行任何代碼。
其他的狀態(created狀態和started狀態)都是非常短暫而且系統通過調用函數使得非常快地轉到下一狀態。
因此,當系統調用了onCreated()之後,非常快地就調用了onStart()方法使得進入下一狀態,而又馬上調用了onResumed又進入了下一狀態。
上面是基本生命週期知識。下面,您開始學習一些具體的生命週期行為。
指定你的程式初次開機的Activity
當使用者從主畫面點擊應用程式圖示,系統會調用你聲明的launcher或者main Activity 的onCreate()函數,這是Activity作為您的應用程式介面為主要切入點。你可以在Androidmanifest.xml檔案中定義程式的主Activity,該檔案在您的項目的根 目錄下。
主Activity必須在manifest檔案中使用<intent-filter>標籤,並包含Main action和LAUNCHER 內容。 例如:
<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項目,預設的項目會包含一個Activity類,並且此類會有如上的聲明。如果mainAction內容或者launcher內容都沒有在您的其中任何一個activity生命中,那麼您的應用程式的表徵圖就不會出現在android的主屏菜單列表上了。
建立一個新的執行個體
大多數的應用程式都會有若干個不同的Activity去讓使用者實現不同的操作。主Activity在當使用者點擊你的應用程式圖示並對使用者的操作作出反應,調用onCreate()方法建立一個Activity的執行個體。
你必須在onCreate()方法中操作一些在整個生命週期內只會調用一次的程式啟動邏輯內容。例如,可以在onCreate()方法中定義使用者介面的或者初始化一些類變數的內容。
例如,以下的代碼向你展示在onCreate()方法中執行活動的一些基本設定,如聲明使用者介面(在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);
}
}
注意:在Android2.0(API 5 Level)或者更高版本中,使用SDK_INT阻止舊的作業系統執行新的API函數,老版本的版本將會遇到“運行時異常”的錯誤。一旦onCreate()方法執行完畢,系統會迅速地執行onStart()方法和onResume()方法。您的Activity永遠不會停留在Created或者Started狀態中。當onStart()方法被調用之後,Activity將會變成可見,但是onResume()方法會迅速被調用,並且Activity會維持在Resumed狀態直到一些事情發生,例如接到電話,或者使用者導航到另一個Activity中,或者螢幕被關閉了。
在後續的其他內容中,你會學習到其他的啟動函數在從Paused或者Stoped狀態中恢複您的Activity的妙用之處。 註:onCreate()方法包含一個參數:savedInstanceState,這將會在後面重建Activity的內容中講到。
圖2:這是描述Activity生命週期結構的另外一個例子,著重強調三個主要的回呼函數在建立一個執行個體中的調用順序:onCreate(),onStart(),onResume()。一旦這個調用順序完成了,Activity將會到達使用者可以互動的Resumed狀態直到使用者選擇去了其他Activity。
銷毀Activity
Activity的第一個生命週期函數是onCreated,最後一個生命週期函數是onDestroy()。系統將調用onDestroy()函數作為Activity從記憶體中完全銷毀去除的最後一個訊號。大多數的應用程式並不需要使用到這個函數,因為局部類的引用將會和Activity一起銷毀,而一些清理工作,主要也是在onPaused()和onStop()中。然而,如果你的Activity包含了有在onCreated()或者其他持久性啟動並執行資源在後台線程行運行,您就應該在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()之後才調用onDestory()方法,但是,有一種情況是例外的,那就是在你在onCreate()方法中調用finish()方法。在一些情況下,你的Activity作為一個臨時決定的操作對象而去啟動另外一個Activity時,你可能需要在onCreate()方法中調用finish()方法去銷毀Activity,在這種情況中,系統會直接調用onDestroy()方法而不用再去調用其他的生命週期函數。