自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android中的Intent詳細(xì)講解

移動開發(fā) Android
Intent是Android中簡單的消息傳遞框架。使用Intent,你可以在整個系統(tǒng)內(nèi)廣播消息或者給特定的Activity或者服務(wù)來執(zhí)行你的行為意圖。系統(tǒng)會決定那個(些)目標(biāo)來執(zhí)行適當(dāng)?shù)男袨?。本文詳?xì)介紹了Intent組件,并用實例介紹了Intent的用法。

在一個Android應(yīng)用中,主要是由四種組件組成的,這四種組件可參考“Android應(yīng)用的構(gòu)成”。

而這四種組件是獨立的,它們之間可以互相調(diào)用,協(xié)調(diào)工作,最終組成一個真正的Android應(yīng)用。

在這些組件之間的通訊中,主要是由Intent協(xié)助完成的。

Intent負(fù)責(zé)對應(yīng)用中一次操作的動作、動作涉及數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述,Android則根據(jù)此Intent的描述,負(fù)責(zé)找到對應(yīng)的組件,將 Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。
因此,Intent在這里起著一個媒體中介的作用,專門提供組件互相調(diào)用的相關(guān)信息,實現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。

例如,在一個聯(lián)系人維護(hù)的應(yīng)用中,當(dāng)我們在一個聯(lián)系人列表屏幕(假設(shè)對應(yīng)的Activity為listActivity)上,點擊某個聯(lián)系人后,希望能夠跳出此聯(lián)系人的詳細(xì)信息屏幕(假設(shè)對應(yīng)的Activity為detailActivity)

為了實現(xiàn)這個目的,listActivity需要構(gòu)造一個 Intent,這個Intent用于告訴系統(tǒng),我們要做“查看”動作,此動作對應(yīng)的查看對象是“某聯(lián)系人”,然后調(diào)用startActivity (Intent intent),將構(gòu)造的Intent傳入,系統(tǒng)會根據(jù)此Intent中的描述,到ManiFest中找到滿足此Intent要求的Activity,系統(tǒng)會調(diào)用找到的 Activity,即為detailActivity,最終傳入Intent,detailActivity則會根據(jù)此Intent中的描述,執(zhí)行相應(yīng)的 操作。

一、抽象描述要描述什么

在Android參考文檔中,對Intent的定義是執(zhí)行某操作的一個抽象描述(確實很抽象)。我們先來看看這里的抽象描述,到底描述了什么。

首先,是要執(zhí)行的動作(action)的一個簡要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android為我們定義了一套標(biāo)準(zhǔn)動作:

MAIN_ACTION
VIEW_ACTION
EDIT_ACTION
PICK_ACTION
GET_CONTENT_ACTION
DIAL_ACTION
CALL_ACTION
SENDTO_ACTION
ANSWER_ACTION
INSERT_ACTION
DELETE_ACTION
RUN_ACTION
LOGIN_ACTION
CLEAR_CREDENTIALS_ACTION
SYNC_ACTION
PICK_ACTIVITY_ACTION
WEB_SEARCH_ACTION

此外,我們還可以根據(jù)應(yīng)用的需要,定義我們自己的動作,并可定義相應(yīng)的Activity來處理我們的自定義動作。

其次,是執(zhí)行動作要操作的數(shù)據(jù)(data),Android中采用指向數(shù)據(jù)的一個URI來表示,如在聯(lián)系人應(yīng)用中,一個指向某聯(lián)系人的URI可能為:content://contacts/1。

這種URI表示,通過 ContentURI這個類來描述,具體可以參考android.net.ContentURI類的文檔。

以聯(lián)系人應(yīng)用為例,以下是一些action / data對,及其它們要表達(dá)的意圖:

VIEW_ACTION content://contacts/1-- 顯示標(biāo)識符為"1"的聯(lián)系人的詳細(xì)信息

EDIT_ACTION content://contacts/1-- 編輯標(biāo)識符為"1"的聯(lián)系人的詳細(xì)信息

VIEW_ACTION content://contacts/-- 顯示所有聯(lián)系人的列表

PICK_ACTION content://contacts/-- 顯示所有聯(lián)系人的列表,并且允許用戶在列表中選擇一個聯(lián)系人,然后把這個聯(lián)系人返回給父activity。例如:電子郵件客戶端可以使用這個Intent,要求用戶在聯(lián)系人列表中選擇一個聯(lián)系人。

另外,除了action和data這兩個重要屬性外,還有一些附加屬性:

category(類別),被執(zhí)行動作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者應(yīng)該在Launcher中作為頂級應(yīng)用出現(xiàn);而ALTERNATIVE_CATEGORY表示當(dāng)前的Intent是一系列的可選動作中的一個,這 些動作可以在同一塊數(shù)據(jù)上執(zhí)行。

type(數(shù)據(jù)類型),顯式指定Intent的數(shù)據(jù)類型(MIME)。一般Intent的數(shù)據(jù)類型能夠根據(jù)數(shù)據(jù)本身進(jìn)行判定,但是通過設(shè)置這個屬性,可以強(qiáng)制采用顯式指定的類型而不再進(jìn)行推導(dǎo)。

component(組件),指定Intent的的目標(biāo)組件的類名稱。通常 Android會根據(jù)Intent 中包含的其它屬性的信息,比如action、data/type、category進(jìn)行查找,最終找到一個與之匹配的目標(biāo)組件。但是,如果 component這個屬性有指定的話,將直接使用它指定的組件,而不再執(zhí)行上述查找過程。指定了這個屬性以后,Intent的其它所有屬性都是可選的。

extras(附加信息),是其它所有附加信息的集合。使用extras可以為組件提供擴(kuò)展信息,比如,如果要執(zhí)行“發(fā)送電子郵件”這個動作,可以將電子郵件的標(biāo)題、正文等保存在extras里,傳給電子郵件發(fā)送組件。

總之,action、 data/type、category和extras 一起形成了一種語言。

這種語言使系統(tǒng)能夠理解諸如“查看某聯(lián)系人的詳細(xì)信息”之類的短語。

隨著應(yīng)用不斷的加入到系統(tǒng)中,它們可以添加新的action、 data/type、category來擴(kuò)展這種語言。

應(yīng)用也可以提供自己的Activity來處理已經(jīng)存在的這樣的“短語”,從而改變這些“短語”的行為。

二、Android如何解析Intent

在應(yīng)用中,我們可以以兩種形式來使用Intent:

直接Intent:指定了component屬性的Intent(調(diào)用setComponent(ComponentName)或者setClass(Context, Class)來指定)。通過指定具體的組件類,通知應(yīng)用啟動對應(yīng)的組件。

間接Intent:沒有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息,在在所有的可用組件中,確定滿足此Intent的組件。

對于直接Intent,Android不需要去做解析,因為目標(biāo)組件已經(jīng)很明確,Android需要解析的是那些間接Intent,通過解析,將 Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。

Intent解析機(jī)制主要是通過查找已注冊在AndroidManifest.xml中的所有IntentFilter及其中定義的Intent,最終找 到匹配的Intent。在這個解析過程中,Android是通過Intent的action、type、category這三個屬性來進(jìn)行判斷的,判斷方 法如下:

如果Intent指明定了action,則目標(biāo)組件的IntentFilter的action列表中就必須包含有這個action,否則不能匹配;

如果Intent沒有提供type,系統(tǒng)將從data中得到數(shù)據(jù)類型。和action一樣,目標(biāo)組件的數(shù)據(jù)類型列表中必須包含Intent的數(shù)據(jù)類型,否則不能匹配。

如果Intent中的數(shù)據(jù)不是content: 類型的URI,而且Intent也沒有明確指定它的type,將根據(jù)Intent中數(shù)據(jù)的scheme (比如 http: 或者mailto: ) 進(jìn)行匹配。同上,Intent 的scheme必須出現(xiàn)在目標(biāo)組件的scheme列表中。

如果Intent指定了一個或多個category,這些類別必須全部出現(xiàn)在組建的類別列表中。比如Intent中包含了兩個類別:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目標(biāo)組件必須至少包含這兩個類別。

三、應(yīng)用例子

以下,以Android SDK中的便箋例子來說明,Intent如何定義及如何被解析。這個應(yīng)用可以讓用戶瀏覽便箋列表、查看每一個便箋的詳細(xì)信息。

  1. <manifest 
  2. xmlns:android="http://schemas.android.com/apk/res/android" 
  3. package="com.google.android.notepad"> 
  4. <application 
  5. android:icon="@drawable/app_notes" 
  6. android:label="@string/app_name"> 
  7. <provider 
  8. class="NotePadProvider" 
  9. android:authorities="com.google.provider.NotePad" 
  10. /> 
  11. <activity 
  12. class=".NotesList" 
  13. android:label="@string/title_notes_list"> 
  14.      <intent-filter> 
  15.        <action android:value="android.intent.action.MAIN"/> 
  16.        <category android:value="android.intent.category.LAUNCHER"/> 
  17.       </intent-filter> 
  18.      <intent-filter> 
  19.        <action android:value="android.intent.action.VIEW"/> 
  20.        <action android:value="android.intent.action.EDIT"/> 
  21.        <action android:value="android.intent.action.PICK"/> 
  22.        <category android:value="android.intent.category.DEFAULT"/> 
  23.        <type android:value="vnd.android.cursor.dir/vnd.google.note"/> 
  24.       </intent-filter> 
  25.      <intent-filter> 
  26.        <action android:value="android.intent.action.GET_CONTENT"/> 
  27.        <category android:value="android.intent.category.DEFAULT"/> 
  28.        <type android:value="vnd.android.cursor.item/vnd.google.note"/> 
  29.       </intent-filter> 
  30.     </activity> 
  31.   <activity class=".NoteEditor" android:label="@string/title_note"> 
  32.      <intent-filter android:label="@string/resolve_edit"> 
  33.        <action android:value="android.intent.action.VIEW"/> 
  34.        <action android:value="android.intent.action.EDIT"/> 
  35.        <category android:value="android.intent.category.DEFAULT"/> 
  36.        <type android:value="vnd.android.cursor.item/vnd.google.note"/> 
  37.       </intent-filter> 
  38.      <intent-filter> 
  39.        <action android:value="android.intent.action.INSERT"/> 
  40.        <category android:value="android.intent.category.DEFAULT"/> 
  41.        <type android:value="vnd.android.cursor.dir/vnd.google.note"/> 
  42.       </intent-filter> 
  43.     </activity> 
  44.   <activity class=".TitleEditor" android:label="@string/title_edit_title" android:theme="@android:style/Theme.Dialog"> 
  45.      <intent-filter android:label="@string/resolve_title"> 
  46.        <action android:value="com.google.android.notepad.action.EDIT_TITLE"/> 
  47.        <category android:value="android.intent.category.DEFAULT"/> 
  48.        <category android:value="android.intent.category.ALTERNATIVE"/> 
  49.        <category android:value="android.intent.category.SELECTED_ALTERNATIVE"/> 
  50.        <type android:value="vnd.android.cursor.item/vnd.google.note"/> 
  51.       </intent-filter> 
  52.     </activity> 
  53. </application> 
  54. </manifest> 

例子中的第一個Activity是com.google.android.notepad.NotesList,它是應(yīng)用的主入口,提供了三個功能,分別由三個 intent-filter進(jìn)行描述:

1、第一個是進(jìn)入便箋應(yīng)用的頂級入口(action為android.app.action.MAIN)。類型為android.app.category.LAUNCHER表明這個Activity將在Launcher中列出。

2、第二個是,當(dāng)type為vnd.android.cursor.dir/vnd.google.note(保存便箋記錄的目錄)時,可以查看可用的便 箋(action為android.app.action.VIEW),或者讓用戶選擇一個便箋并返回給調(diào)用者(action為 android.app.action.PICK)。

3、第三個是,當(dāng)type為vnd.android.cursor.item/vnd.google.note時,返回給調(diào)用者一個用戶選擇的便箋 (action為android.app.action.GET_CONTENT),而用戶卻不需要知道便箋從哪里讀取的。有了這些功能,下面的 Intent就會被解析到NotesList這個activity:

{ action=android.app.action.MAIN }:與此Intent匹配的Activity,將會被當(dāng)作進(jìn)入應(yīng)用的頂級入口。

{ action=android.app.action.MAIN, category=android.app.category.LAUNCHER }:這是目前Launcher實際使用的 Intent,用于生成Launcher的頂級列表。

{ action=android.app.action.VIEW data=content://com.google.provider.NotePad/notes }:

顯示"content://com.google.provider.NotePad/notes"下的所有便箋的列表,使用者可以遍歷列表,并且察看某便箋的詳細(xì)信息。

{ action=android.app.action.PICK data=content://com.google.provider.NotePad/notes }:

顯示"content://com.google.provider.NotePad/notes"下的便箋列表,讓用戶可以在列表中選擇一個,然后將選擇的便箋的 URL返回給調(diào)用者。

{ action=android.app.action.GET_CONTENT type=vnd.android.cursor.item/vnd.google.note }:和上面的action為pick的Intent類似,不同的是這個Intent允許調(diào)用者(在這里指要調(diào)用NotesList的某個 Activity)指定它們需要返回的數(shù)據(jù)類型,系統(tǒng)會根據(jù)這個數(shù)據(jù)類型查找合適的 Activity(在這里系統(tǒng)會找到NotesList這個Activity),供用戶選擇便箋。

第二個Activity是com.google.android.notepad.NoteEditor,它為用戶顯示一條便箋,并且允許 用戶修改這個便箋。

它定義了兩個intent-filter,所以具有兩個功能。

第一個功能是,當(dāng)數(shù)據(jù)類型為 vnd.android.cursor.item/vnd.google.note時,允許用戶查看和修改一個便簽(action為 android.app.action.VIEW和android.app.action.EDIT)。

第二個功能是,當(dāng)數(shù)據(jù)類型為 vnd.android.cursor.dir/vnd.google.note,為調(diào)用者顯示一個新建便箋的界面,并將新建的便箋插入到便箋列表中(action為android.app.action.INSERT)。

有了這兩個功能,下面的Intent就會被解析到NoteEditor這個activity:

{ action=android.app.action.VIEW data=content://com.google.provider.NotePad/notes/{ID}} :向用戶顯示標(biāo)識為 ID的便箋。

{ action=android.app.action.EDIT data=content://com.google.provider.NotePad/notes/{ID}}:允許用戶編輯標(biāo)識為ID的便箋。

{ action=android.app.action.INSERT data=content://com.google.provider.NotePad/notes }:在“content://com.google.provider.NotePad/notes”這個便箋列表中創(chuàng)建一個新的空便箋,并允許用戶編輯 這個便簽。當(dāng)用戶保存這個便箋后,這個新便箋的URI將會返回給調(diào)用者。

最后一個Activity是com.google.android.notepad.TitleEditor,它允許用戶編輯便箋的標(biāo)題。

它可以被實現(xiàn)為一個應(yīng)用可以直接調(diào)用(在Intent中明確設(shè)置component屬性)的類,不過這里我們將為你提供一個在現(xiàn)有的數(shù)據(jù)上發(fā)布可選操作的方法。

在這個 Activity的唯一的intent-filter中,擁有一個私有的action: com.google.android.notepad.action.EDIT_TITLE,表明允許用戶編輯便箋的標(biāo)題。

和前面的view和edit 動作一樣,調(diào)用這個Intent 的時候,也必須指定具體的便箋(type為vnd.android.cursor.item/vnd.google.note)。不同的是,這里顯示和編輯的只是便箋數(shù)據(jù)中的標(biāo)題。

除了支持缺省類別(android.intent.category.DEFAULT),標(biāo)題編輯器還支持另外兩個標(biāo)準(zhǔn)類別:

android.intent.category.ALTERNATIVE和android.intent.category.SELECTED_ALTERNATIVE。

實現(xiàn)了這兩個類別之后,其它 Activity就可以調(diào)用queryIntentActivityOptions(ComponentName, Intent[], Intent, int)查詢這個Activity提供的action,而不需要了解它的具體實現(xiàn);

或者調(diào)用addIntentOptions(int, int, ComponentName, Intent[], Intent, int, Menu.Item[])建立動態(tài)菜單。需要說明的是,在這個intent-filter中有一個明確的名稱(通過android:label= "@string/resolve_title"指定),在用戶瀏覽數(shù)據(jù)的時候,如果這個Activity是數(shù)據(jù)的一個可選操作,指定明確的名稱可以為用 戶提供一個更好控制界面。

有了這個功能,下面的Intent就會被解析到TitleEditor這個Activity:

{ action=com.google.android.notepad.action.EDIT_TITLE data=content://com.google.provider.NotePad/notes/{ID}}:顯示并且允許用戶編輯標(biāo)識為ID的便 箋的標(biāo)題。

責(zé)任編輯:徐川 來源: net
相關(guān)推薦

2009-04-03 08:21:37

AndroidGoogle移動OS

2014-07-15 10:16:02

AndroidIntent

2013-01-10 14:54:48

Android開發(fā)組件Intent

2010-01-25 16:52:22

Android Int

2013-05-27 14:06:14

Android開發(fā)移動開發(fā)Intent機(jī)制

2013-03-28 09:07:37

Android開發(fā)Intent機(jī)制

2012-07-23 13:22:42

Intent Filt安全Android

2009-06-30 10:59:38

fckeditorJSP

2023-03-17 08:11:25

2010-01-06 09:40:07

Ubuntu時間設(shè)置

2010-05-17 16:31:04

IIS Request

2009-09-25 17:03:29

Hibernate是什

2009-12-14 11:29:19

Linux查看命令

2011-06-14 15:39:46

單元測試

2010-08-18 10:13:55

IntentAndroid

2011-04-06 17:35:17

Access數(shù)據(jù)庫空記錄

2010-04-29 10:15:01

Unix系統(tǒng)

2010-06-17 12:57:27

如何修復(fù)Grub

2009-04-03 08:26:02

2010-05-07 14:11:06

Unix--Tripw
點贊
收藏

51CTO技術(shù)棧公眾號