Jollen 的 Android 教學,#26: 強大的Intent機制

jollen 發表於 July 16, 2009 12:27 PM

什麼是Intent(意圖)?

強大的事件處理「Intent」(意圖)是Android很強大的一種機制。

在 Android 應用程式框架中,有一個非常聰明的事件處理機制,稱之為「Intent」。Intent(意圖)的作用與事件(event)很像,但與傳統的事件處理仍然有些差異。傳統的事件處理,講求的是「處理者(handler)的觸發」,當一事件發生時,便callback讓事件的處理者,或是直接將該事件轉送(forward)給應用程式,由應用程式決定處理方式。

在「Intent」這樣的事件處理觀念裡,Android 試圖將事件解釋為「應用程式的意圖」或是「使用者的意圖」,並試著去解釋該意圖的目的,若 Android 系統本身能理解應用程式的意圖,便會「自行」去處理該意圖所應執行的工作。

Android的做法是,讓每個意圖(Intent)都帶有一個動作(action),並根據不同的動作去行動。

關於前述教學提到的Intent

在前面的教學裡,我們用到二次Intent如下:

1. 自行定義一個Intent、設定Service可接收此Intent,並透過「送出Intent給框架」的方式,請框架啟動該Service

2. 使用Android內部定義的動作「ACTION_VIEW」,來「檢視」(view)一個「URL」資料,當框架看到內部定義的ACTION_VIEW動作時,便「自行」處理該Intent;處理的方式是啟動WebView並連上網站

以前述的教學為例,使用內建的動作“ACTION_VIEW”就可以很容易做出一個「啟動瀏覽器(WebView類別)上網」的應用程式。

透過這二個例子我們知道,Intent的動作可以是自行定義與框架內部定義二種。Android框架的Intent有很多方便實用的「內建動作」,以下我們說明Android內建Intent的美麗之處。

Android內建的Intent Action

Android的框架確實是讓每個Intent都包含了一個動作,就稱為action。

為了讓大家更容易了解Intent的基本觀念,我們採用「體驗」的方式來說明如何使用內建的Action。現在,我們列舉以下三個情境,並分別實作其範例:

HelloIntentDialer: 啟動撥號器(dialer)並撥號
HelloIntentMusic: 使用者按下「Select Music」後,可以由音樂清單裡選擇音樂並撥放
HelloIntentWallpaper: 啟動Android內建的「背景圖選擇器」,讓使用者更換背景

第二個範例”HelloIntentMusic”其實是ApiDemo裡的範例,而且是很容易能了解Intent內涵的好程式。

除了action外,Intent還可以包含另外一項資訊「data」。

Intent的action指定這個Intent的「動作」是什麼,框架會依指定的動作進行處理;有些action可以附帶一筆資料,這個資料是以Uri的格式撰寫,在HelloIntentDialer的範例會再做說明。

內建的Intent有哪些呢?請參考Android Reference Guide中的Intent類別說明。上述三個範例分別使用以下三個action:

1. ACTION_CALL: 撥號
2. ACTION_GET_CONTENT: 啟動內容選取器
3. ACTION_SET_WALLPAPER: 設定Wallpaper

在進行範例講解前,可以先行閱讀Intent類別的說明。ACTION_CALL是一個內建的action,我們只要產生一個Intent物件,並定義其「action」為ACTION_CALL即可通知框架「打電話」。

Android內建的action是相當實用的應用開發機制,同時也是Android OS最具代表性的機制之一。Android內建的Intent action分為二種:

1. Activity Action: 啟動Activity的action
2. Broadcast Action: 透過廣撥器處理的action

第一種action是activity action,用途是通知框架啟動Activity,這裡提出的三個範例,都是使用activity action。Broadcast action將在Broadcast的教學裡再做說明。

* Update: 2009/08/07

讀者留言 (3)

  • LCamel 於 October 14, 2009 10:49:

    "Android的框架確實是讓每個Intent都包含了一個動作,就稱為action。"

    或許可以補充一下... ? explicit intent 不需有 action.

  • Shih-Peng 於 April 16, 2010 18:03:

    不如說explicit intent是比較特殊的intent;每個explicit intent都有一個預設動作,而那個預設動作只有targeting component會處理,因此只會由該component接收。

  • al 於 February 24, 2014 21:06:

    intent 可以在不開lunch下傳遞訊息嗎?
    我每次用intent傳遞訊息都會開啟lunch.
    如果可以,可以教我嗎?

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。