Android Activity


活動(activity)表示一個單一螢幕上的使用者介面。例如,電子郵件應用程式可能是一個活動,顯示新的電子郵寄清單是另一個活動,撰寫電子郵件,閱讀電子郵件可能又是其它的活動。如果應用程式有一個以上的活動,那麼應該將其中的一個活動標記為活動啟動應用程式。

如果曾使用C,C++或Java程式設計語言,那麼可以知道一般程式是從 main() 函式開始。相似地,Android系統是一個Activity 的 onCreate() 方法呼叫開始啟動程式。一個回撥方法 - 啟動一個活動,以及其它回撥方法,如銷毀一個活動,活動的生命週期如下圖所示序列:

Android Activity lifecycle

Activity類定義了以下的回撥方法,即事件。並不需要實現所有的回撥方法。然而重要的是了解每一個變化以及實現,以確保應用程式如使用者所期望的行為或方式。

回撥方法 描述
onCreate() 這是第一次回撥,活動在第一次建立時呼叫。
onStart() 這個回撥被稱為活動時變成對使用者可見。
onResume() 這就是所謂的啟動,當使用者與應用程式互動。
onPause() 暫停活動不接收使用者輸入並不執行任何程式碼並呼叫時,當前的活動被暫停,恢復以前的活動。
onStop() 這個回撥被稱為活動時不再可見
onDestroy() 活動前由系統被銷毀,呼叫此回撥
onRestart() 活動重新啟動時,停止後呼叫此回撥

例子

這個例子通過簡單的步驟,顯示Android應用程式活動的生命週期。按照下面的步驟來修改Android應用程式,在建立的 Hello World 範例章節:

步驟 描述
1 我們將使用Eclipse IDE中建立一個Android應用程式,並將其命名在 HelloWorld 的包下,如:com.example.helloworld的Hello World範例章節解釋。
2 修改Main活動檔案MainActivity.java,其餘檔案保持不變。
3 執行該應用程式啟動Android模擬器並驗證應用程式中所做的更改結果。

以下是修改主要活動檔案src/com.example.helloworld/MainActivity.java後的內容,該檔案包含了每個基本生命周期方法。 Log.d() 方法是用來生成紀錄檔訊息: 

package com.example.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;

public class MainActivity extends Activity {
   String msg = "Android : ";
   
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Log.d(msg, "The onCreate() event");
   }

   /** Called when the activity is about to become visible. */
   @Override
   protected void onStart() {
      super.onStart();
      Log.d(msg, "The onStart() event");
   }

   /** Called when the activity has become visible. */
   @Override
   protected void onResume() {
      super.onResume();
      Log.d(msg, "The onResume() event");
   }

   /** Called when another activity is taking focus. */
   @Override
   protected void onPause() {
      super.onPause();
      Log.d(msg, "The onPause() event");
   }

   /** Called when the activity is no longer visible. */
   @Override
   protected void onStop() {
      super.onStop();
      Log.d(msg, "The onStop() event");
   }

   /** Called just before the activity is destroyed. */
   @Override
   public void onDestroy() {
      super.onDestroy();
      Log.d(msg, "The onDestroy() event");
   }
}

活動類載入UI元件,使用在專案的 res/layout 檔案夾的XML檔案。下面的語句從 res/layout/activity_main.xml 檔案載入UI元件:

setContentView(R.layout.activity_main);

應用程式可以有一個或多個活動受任何限制。每個活動定義為應用程式必須在AndroidManifest.xml檔案中宣告,必須宣告應用程式的主要活動列表<intent-filter>,包括如下MAIN 操作和 LAUNCHER 類:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.helloworld"
   android:versionCode="1"
   android:versionName="1.0" >
   <uses-sdk
      android:minSdkVersion="8"
      android:targetSdkVersion="15" />
   <application
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
       <activity
           android:name=".MainActivity"
           android:label="@string/title_activity_main" >
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER"/>
           </intent-filter>
       </activity>
   </application>
</manifest>

如果 MAIN 動作或LAUNCHER類不宣告一個活動,那麼應用程式圖示將不會出現在應用程式列表的主螢幕上。 

現在嘗試執行修改後的 Hello World!應用程式。假設已經建立了AVD,同時做環境設定。從Eclipse執行應用程式,開啟一個專案的活動檔案,並單擊“Run” Eclipse Run Icon 圖示。Eclipse 在 AVD上安裝應用程式,並啟動它,如果設定和應用都沒有問題,它會顯示模擬器視窗中,也應該看到以下紀錄檔訊息在Eclipse IDE LogCat 視窗:

07-19 15:00:43.405: D/Android :(866): The onCreate() event
07-19 15:00:43.405: D/Android :(866): The onStart() event
07-19 15:00:43.415: D/Android :(866): The onResume() event
Android LotCat Window

點選紅色按鈕Android Red Button - 在Android模擬器上的紅色按鈕,它會在Eclipse IDE視窗LogCat中生成以下事件訊息:  

07-19 15:01:10.995: D/Android :(866): The onPause() event
07-19 15:01:12.705: D/Android :(866): The onStop() event

讓我們再次嘗試單擊選單按鈕Android Menu Button - Android選單按鈕在Android模擬器中,它會在Eclipse IDE 的 LogCat視窗中生成以下事件訊息: 

07-19 15:01:13.995: D/Android :(866): The onStart() event
07-19 15:01:14.705: D/Android :(866): The onResume() event

接下來,就讓我們再次嘗試點選後退按鈕Android Back Button - Android後退按鈕在Android模擬器,它會生成以下事件訊息在Eclipse IDE LogCat視窗中,以上完成Android應用程式Acitivity 的生命週期。 

07-19 15:33:15.687: D/Android :(992): The onPause() event
07-19 15:33:15.525: D/Android :(992): The onStop() event
07-19 15:33:15.525: D/Android :(992): The onDestroy() event