Android的Intent機(jī)制實(shí)例講解
在Android應(yīng)用程序框架中,有一個(gè)比較強(qiáng)大的事件處理機(jī)制——Intent(意圖)。Intent(意圖)的作用與事件(event)很像,但與傳統(tǒng)的事件處理有些差異。
傳統(tǒng)的事件處理,講究的是處理者(handler)的觸發(fā),當(dāng)事件發(fā)生時(shí),便callback事件的處理者,或是直接將該事件傳送(forward)給應(yīng)用程序,由應(yīng)用程序決定處理方式。
在「Intent」這樣的事件處理觀念里,Android 試圖將事件解釋為「應(yīng)用程序的意圖」或是「使用者的意圖」,并試著去解釋該意圖的目的,若 Android 系統(tǒng)本身能理解應(yīng)用程序的意圖,便會(huì)自行去處理該意圖所應(yīng)執(zhí)行的工作。Android的做法是,在每一意圖(Intent)都帶有一個(gè)動(dòng)作 (action),并根據(jù)不同的動(dòng)作去行動(dòng)。
下面是一個(gè)通過Intent實(shí)現(xiàn)一個(gè)自動(dòng)撥號的例子:
建立一個(gè)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();
- }
- }
因?yàn)閜ermission的關(guān)系,所以也要在AndroidManifest.xml里加上「CALL_PHONE」的權(quán)限。編輯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>
這個(gè)例子相當(dāng)簡單,但足以說明Intent的核心了。代碼說明:
先新建一個(gè)Intent對象:
- Intent dial = new Intent();
設(shè)定Intent的action為「android.intent.action.CALL」,這是一個(gè)內(nèi)建的action:
- dial.setAction("android.intent.action.CALL");
內(nèi)建action「CALL」需要附帶一筆資料,而資料的寫法是使用URI格式:
- dial.setData(Uri.parse("tel:XXXXX"));
「CALL」是一個(gè)activity action,所以調(diào)用startActivity()將Intent送給框架:
- startActivity(dial);
這個(gè)例子的概念并不難理解:送出一個(gè)帶有內(nèi)建action的Intent給框架,因?yàn)閍ction為CALL,所以框架會(huì)去啟動(dòng)撥號activity并撥打電話。
程序運(yùn)行結(jié)果: