活動(dòng)(activity)表示一個(gè)單一屏幕上的用戶界面。例如,電子郵件應(yīng)用程序可能是一個(gè)活動(dòng),顯示新的電子郵件列表是另一個(gè)活動(dòng),撰寫(xiě)電子郵件,閱讀電子郵件可能又是其它的活動(dòng)。如果應(yīng)用程序有一個(gè)以上的活動(dòng),那么應(yīng)該將其中的一個(gè)活動(dòng)標(biāo)記為活動(dòng)啟動(dòng)應(yīng)用程序。
如果曾使用C,C++或Java編程語(yǔ)言,那么可以知道一般程序是從 main() 函數(shù)開(kāi)始。相似地,Android系統(tǒng)是一個(gè)Activity 的 onCreate() 方法調(diào)用開(kāi)始啟動(dòng)程序。一個(gè)回調(diào)方法 - 啟動(dòng)一個(gè)活動(dòng),以及其它回調(diào)方法,如銷毀一個(gè)活動(dòng),活動(dòng)的生命周期如下圖所示序列:
Activity類定義了以下的回調(diào)方法,即事件。并不需要實(shí)現(xiàn)所有的回調(diào)方法。然而重要的是了解每一個(gè)變化以及實(shí)現(xiàn),以確保應(yīng)用程序如用戶所期望的行為或方式。
回調(diào)方法 | 描述 |
---|---|
onCreate() | 這是第一次回調(diào),活動(dòng)在第一次創(chuàng)建時(shí)調(diào)用。 |
onStart() | 這個(gè)回調(diào)被稱為活動(dòng)時(shí)變成對(duì)用戶可見(jiàn)。 |
onResume() | 這就是所謂的啟動(dòng),當(dāng)用戶與應(yīng)用程序交互。 |
onPause() | 暫?;顒?dòng)不接收用戶輸入并不執(zhí)行任何代碼并調(diào)用時(shí),當(dāng)前的活動(dòng)被暫停,恢復(fù)以前的活動(dòng)。 |
onStop() | 這個(gè)回調(diào)被稱為活動(dòng)時(shí)不再可見(jiàn) |
onDestroy() | 活動(dòng)前由系統(tǒng)被銷毀,調(diào)用此回調(diào) |
onRestart() | 活動(dòng)重新啟動(dòng)時(shí),停止后調(diào)用此回調(diào) |
這個(gè)例子通過(guò)簡(jiǎn)單的步驟,顯示Android應(yīng)用程序活動(dòng)的生命周期。按照下面的步驟來(lái)修改Android應(yīng)用程序,在創(chuàng)建的 Hello World 范例章節(jié):
步驟 | 描述 |
---|---|
1 | 我們將使用Eclipse IDE中創(chuàng)建一個(gè)Android應(yīng)用程序,并將其命名在 HelloWorld 的包下,如:com.example.helloworld的Hello World范例章節(jié)解釋。 |
2 | 修改Main活動(dòng)文件MainActivity.java,其余文件保持不變。 |
3 | 運(yùn)行該應(yīng)用程序啟動(dòng)Android模擬器并驗(yàn)證應(yīng)用程序中所做的更改結(jié)果。 |
以下是修改主要活動(dòng)文件src/com.example.helloworld/MainActivity.java后的內(nèi)容,該文件包含了每個(gè)基本生命周期方法。 Log.d() 方法是用來(lái)生成日志消息:
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"); } }
活動(dòng)類加載UI組件,使用在項(xiàng)目的 res/layout 文件夾的XML文件。下面的語(yǔ)句從 res/layout/activity_main.xml 文件加載UI組件:
setContentView(R.layout.activity_main);
應(yīng)用程序可以有一個(gè)或多個(gè)活動(dòng)受任何限制。每個(gè)活動(dòng)定義為應(yīng)用程序必須在AndroidManifest.xml文件中聲明,必須聲明應(yīng)用程序的主要活動(dòng)列表<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 動(dòng)作或LAUNCHER類不聲明一個(gè)活動(dòng),那么應(yīng)用程序圖標(biāo)將不會(huì)出現(xiàn)在應(yīng)用程序列表的主屏幕上。
現(xiàn)在嘗試運(yùn)行修改后的 Hello World!應(yīng)用程序。假設(shè)已經(jīng)創(chuàng)建了AVD,同時(shí)做環(huán)境設(shè)置。從Eclipse運(yùn)行應(yīng)用程序,打開(kāi)一個(gè)項(xiàng)目的活動(dòng)文件,并單擊“Run” 圖標(biāo)。Eclipse 在 AVD上安裝應(yīng)用程序,并啟動(dòng)它,如果設(shè)置和應(yīng)用都沒(méi)有問(wèn)題,它會(huì)顯示仿真器窗口中,也應(yīng)該看到以下日志消息在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
點(diǎn)擊紅色按鈕 - 在Android模擬器上的紅色按鈕,它會(huì)在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
讓我們?cè)俅螄L試單擊菜單按鈕 - Android菜單按鈕在Android模擬器中,它會(huì)在Eclipse IDE 的 LogCat窗口中生成以下事件消息: