Latest web development tutorials

Android 活動(Activity)

活動代表了一個具有用戶界面的單一屏幕,如Java 的窗口或者幀。 Android 的活動是ContextThemeWrapper 類的子類。

如果你曾經用C,C++ 或者Java 語言編程,你應該知道這些程序從main() 函數開始。 很類似的,Android 系統初始化它的程序是通過活動中的onCreate() 回調的調用開始的。 存在有一序列的回調方法來啟動一個活動,同時有一序列的方法來關閉活動,如下面的活動聲明周期圖所示:

圖片

Activity 類定義了下面的回調。 你可以不用實現所有的回調方法。 當了解其中的每一個非常的重要,實現這些可以保證你的應用行為如用戶所期望的那樣。

回調 描述
onCreate() 這是第一個回調,在活動第一次創建是調用
onStart() 這個回調在活動為用戶可見時被調用
onResume() 這個回調在應用程序與用戶開始可交互的時候調用
onPause() 被暫停的活動無法接受用戶輸入,不能執行任何代碼。 噹噹前活動將要被暫停,上一個活動將要被恢復是調用
onStop() 當活動不在可見時調用
onDestroy() 當活動被系統銷毀之前調用
onRestart() 當活動被停止以後重新打開時調用

實例

這個實例通過簡單地步驟展示Anroid 應用程序活動的生命週期。 按照下面的步驟來修改我們在Hello World 實例章節中創建的Android 應用程序。

步驟 描述
1 使用eclipse IDE來創建一個Android應用程序,並命名為HelloWorld放在com.example.helloworld包下。 如之前Hello World Example章節中介紹。
2 按照下面修改主要活動文件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 : ";

   /** 当活动第一次被创建时调用 */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Log.d(msg, "The onCreate() event");
   }

   /** 当活动即将可见时调用 */
   @Override
   protected void onStart() {
      super.onStart();
      Log.d(msg, "The onStart() event");
   }

   /** 当活动可见时调用 */
   @Override
   protected void onResume() {
      super.onResume();
      Log.d(msg, "The onResume() event");
   }

   /** 当其他活动获得焦点时调用 */
   @Override
   protected void onPause() {
      super.onPause();
      Log.d(msg, "The onPause() event");
   }

   /** 当活动不再可见时调用 */
   @Override
   protected void onStop() {
      super.onStop();
      Log.d(msg, "The onStop() event");
   }

   /** 当活动将被销毁时调用 */
   @Override
   public void onDestroy() {
      super.onDestroy();
      Log.d(msg, "The onDestroy() event");
   }
}

活動類從項目的res/layout中的XML文件加載所有的UI組件。 下面的語句從res/layout/activity_main.xml文件中加載UI組件:

setContentView(R.layout.activity_main);

一個應用程序可以有1個或多個活動,而沒有任何限制。 每個為應用程序所定義的活動都需要在AndroidManifest.xml中聲明。 應用的主要活動需要在清單中聲明,且意圖過濾器標籤中需要包含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="22" />

   <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 類別沒有在活動中聲明,那麼應用程序的圖標將不會出現在主屏幕的應用列表中。

讓我們運行起剛剛修改的"Hellow World!" 應用程序。 假設你在環境搭建的時候已經創建了AVD 。 從Eclipse 運行應用,打開一個項目中的活動文件,並從工具欄點擊運行 圖片 圖標。 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 模擬器上的紅色按鈕 圖片 ,它將在Eclipse IDE的LogCat窗口中產生如下的事件消息:

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

讓我們再次點擊Android 模擬器上的菜單按鈕 圖片 ,它將在Eclipse IDE 的LogCat 窗口中產生如下的事件消息:

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

接下來,讓我們點擊Android模擬器上的返回按鈕 圖片 ,它將在Eclipse IDE的LogCat窗口中產生如下的事件消息,Android 應用程序上活動的整個生命週期完成。

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