在Android應用程序框架中,有一個比較強大的事件處理機制——Intent(意圖)。Intent(意圖)的作用與事件(event)很像,但與傳統的事件處理有些差異。
傳統的事件處理,講究的是處理者(handler)的觸發,當事件發生時,便callback事件的處理者,或是直接將該事件傳送(forward)給應用程序,由應用程序決定處理方式。
在「Intent」這樣的事件處理觀念裡,Android 試圖將事件解釋為「應用程序的意圖」或是「使用者的意圖」,並試著去解釋該意圖的目的,若 Android 系統本身能理解應用程序的意圖,便會自行去處理該意圖所應執行的工作。Android的做法是,在每一意圖(Intent)都帶有一個動作(action),並根據不同的動作去行動。
下面是一個通過Intent實現一個自動撥號的例子:
建立一個android工程IntentDialer,編輯IntentDialer.java:
- package com.android;
-
- import android.app.Activity;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.widget.Toast;
-
- public class IntentDialerActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- Intent dial = new Intent();
- dial.setAction("android.intent.action.CALL");
- dial.setData(Uri.parse("tel:13428720000"));
- startActivity(dial);
- Toast.makeText(this, "calling to young 13428720000", Toast.LENGTH_LONG).show();
- }
- }
因為permission的關系,所以也要在AndroidManifest.xml裡加上「CALL_PHONE」的權限。編輯AndroidManifest.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android"
- android:versionCode="1"
- android:versionName="1.0" >
-
- <uses-sdk android:minSdkVersion="10" />
-
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name" >
- <activity
- android:name=".IntentDialerActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
-
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-permission android:name="android.permission.CALL_PHONE" />
-
-
- </manifest>
這個例子相當簡單,但足以說明Intent的核心了。代碼說明:
- 先新建一個Intent對象:
Intent dial = new Intent();
- 設定Intent的action為「android.intent.action.CALL」,這是一個內建的action:
dial.setAction("android.intent.action.CALL");
內建action「CALL」需要附帶一筆資料,而資料的寫法是使用URI格式:
dial.setData(Uri.parse("tel:XXXXX"));
- 「CALL」是一個activity action,所以調用startActivity()將Intent送給框架:
startActivity(dial);
這個例子的概念並不難理解:送出一個帶有內建action的Intent給框架,因為action為CALL,所以框架會去啟動撥號activity並撥打電話。
程序運行結果:
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11