日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Intent机制详解

發(fā)布時間:2024/4/15 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Intent机制详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是Intent


?Intent 是一個將要執(zhí)行的動作的抽象描述,一般來說是作為參數(shù)來使用,由Intent來協(xié)助完成android各個組件之間的通訊。比如說調用startActivity()來啟動一個activity,或者由broadcaseIntent()來傳遞給所有感興趣的BroadcaseReceiver, 再或者由startService()/bindservice()來啟動一個后臺的service.所以可以看出來,intent主要是用來啟動其他的activity 或者service,所以可以將intent理解成activity之間的粘合劑。


Intent是一種運行時綁定(run-time binding)機制,它能在程序運行過程中連接兩個不同的組件。通過Intent,你的程序可以向Android表達某種請求或者意愿,Android會根據(jù)意愿的內容選擇適當?shù)慕M件來完成請求。比如,有一個Activity希望打開網(wǎng)頁瀏覽器查看某一網(wǎng)頁的內容,那么這個Activity只需要發(fā)出WEB_SEARCH_ACTION給Android,Android就會根據(jù)Intent的請求內容,查詢各組件注冊時聲明的IntentFilter,找到網(wǎng)頁瀏覽器的Activity來瀏覽網(wǎng)頁。

Android的三個基本組件——Activity,Service和Broadcast Receiver——都是通過Intent機制激活的,不同類型的組件有不同的傳遞Intent方式:


1.1 要激活一個新的Activity,或者讓一個現(xiàn)有的Activity做新的操作,可以通過調用Context.startActivity()或者Activity.startActivityForResult()方法。

1.2 要啟動一個新的Service,或者向一個已有的Service傳遞新的指令,調用Context.startService()方法或者調用Context.bindService()方法將調用此方法的上下文對象與Service綁定。


1.3 Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()這三個方法可以發(fā)送Broadcast Intent。發(fā)送之后,所有已注冊的并且擁有與之相匹配IntentFilter的BroadcastReceiver就會被激活。

Intent一旦發(fā)出,Android都會準確找到相匹配的一個或多個Activity,Service或者BroadcastReceiver作響應。所以,不同類型的Intent消息不會出現(xiàn)重疊,即Broadcast的Intent消息只會發(fā)送給BroadcastReceiver,而決不會發(fā)送給Activity或者Service。由startActivity()傳遞的消息也只會發(fā)給Activity,由startService()傳遞的Intent只會發(fā)送給Service。


Intent的構成


要在不同的activity之間傳遞數(shù)據(jù),就要在intent中包含相應的內容,一般來說數(shù)據(jù)中最基本的應該包括:


Action:用來指明要實施的動作是什么,比如說ACTION_VIEW, ACTION_EDIT等。具體的可以查閱android SDK-> reference中的Android.content.intent類,里面的constants中定義了所有的action。


當日常生活中,描述一個意愿或愿望的時候,總是有一個動詞在其中。比如:我想?三個俯臥撐;我要?一部x片;我要?一部血淚史,之類云云。在Intent中,Action就是描述看、做、寫等動作的,當你指明了一個Action,執(zhí)行者就會依照這個動作的指示,接受相關輸入,表現(xiàn)對應行為,產(chǎn)生符合的輸出。在Intent類中,定義了一批量的動作,比如ACTION_VIEWACTION_PICK?,之類的,基本涵蓋了常用動作,整一個降龍十八掌全集。


一些常用的Action:


ACTION_CALL activity 啟動一個電話.
ACTION_EDIT activity 顯示用戶編輯的數(shù)據(jù).
ACTION_MAIN activity 作為Task中第一個Activity啟動
ACTION_SYNC activity 同步手機與數(shù)據(jù)服務器上的數(shù)據(jù).
ACTION_BATTERY_LOW broadcast receiver 電池電量過低警告.
ACTION_HEADSET_PLUG broadcast receiver 插拔耳機警告
ACTION_SCREEN_ON broadcast receiver 屏幕變亮警告.
ACTION_TIMEZONE_CHANGED broadcast receiver 改變時區(qū)警告.


Data: 要事實的具體的數(shù)據(jù),一般由一個Uri變量來表示

Category:一個字符串,包含了關于處理該intent的組件的種類的信息。一個intent對象可以有任意個category。intent類定義了許多category常數(shù).

addCategory()方法為一個intent對象增加一個category,
removeCategory刪除一個category,
getCategories()獲取intent所有的category.


Type:顯式指定Intent的數(shù)據(jù)類型(MIME)(多用途互聯(lián)網(wǎng)郵件擴展,Multipurpose Internet Mail Extensions)。比如,一個組件是可以顯示圖片數(shù)據(jù)的而不能播放聲音文件。很多情況下,data類型可在URI中找到,比如content:開頭的URI,表明數(shù)據(jù)由設備上的content provider提供。但是通過設置這個屬性,可以強制采用顯式指定的類型而不再進行推導。


MIME類型有2種形式


1.1? 單個記錄的格式: vnd.android.cursor.item/vnd.yourcompanyname.contenttype,如:content://com.example.transportationprovider/trains/122(一條列車信息的uri)的MIME類型是vnd.android.cursor.item/vnd.example.rail


1.2 多個記錄的格式:vnd.android.cursor.dir/vnd.yourcompanyname.contenttype,如:content://com.example.transportationprovider/trains (所有列車信息)的MIME類型是vnd.android.cursor.dir/vnd.example.rail


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

Intent it = new Intent(Activity.Main.this, Activity2.class); startActivity(it);

startActivity(it);


extras:附加信息,例如ACTION_TIMEZONE_CHANGED的intent有一個"time-zone"附加信息來指明新的時區(qū),而ACTION_HEADSET_PLUG有一個“state”附加信息來指示耳機是被插入還是被拔出。intent對象有一系列put...()和set...()方法來設定和獲取附加信息。 這些方法和Bundle對象很像。事實上附加信息可以使用putExtras()和getExtras()作為Bundle來讀和寫。例如:


//用Bundle傳遞數(shù)據(jù) Intent it = new Intent(Activity.Main.this, Activity2.class); Bundle bundle=new Bundle(); bundle.putString("name", "This is from MainActivity!"); it.putExtras(bundle); startActivity(it); //獲得數(shù)據(jù) Bundle bundle=getIntent().getExtras(); String name=bundle.getString("name");


intent的解析:

在應用中,我們可以以兩種形式來使用Intent:


1.1 顯式Intent:指定了component屬性的Intent(調用setComponent(ComponentName)或者setClass(Context, Class)來指定)。通過指定具體的組件類,通知應用啟動對應的組件。

2.2 隱式Intent:沒有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息,在在所有的可用組件中,確定滿足此Intent的組件。
對于直接Intent,Android不需要去做解析,因為目標組件已經(jīng)很明確,Android需要解析的是那些間接Intent,通過解析將 Intent映射給可以處理此Intent的Activity、Service或Broadcast Receiver。



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

Manifest.xml

Xml代碼??
  • <manifest?xmlns:android="http://schemas.android.com/apk/res/android"???
  • package="com.google.android.notepad">???
  • ????<application?android:icon="@drawable/app_notes"???
  • android:label="@string/app_name">???
  • ????<provider?class="NotePadProvider"???
  • android:authorities="com.google.provider.NotePad"?/>???
  • ????<activity?class=".NotesList"="@string/title_notes_list">???
  • ??????<intent-filter>???
  • ????????<action?android:value="android.intent.action.MAIN"/>???
  • ????????<category?android:value="android.intent.category.LAUNCHER"?/>???
  • ??????</intent-filter>???
  • ??????<intent-filter>???
  • ????????<action?android:value="android.intent.action.VIEW"/>???
  • ????????<action?android:value="android.intent.action.EDIT"/>???
  • ????????<action?android:value="android.intent.action.PICK"/>???
  • ????????<category?android:value="android.intent.category.DEFAULT"?/>???
  • ????????<type?android:value="vnd.android.cursor.dir/vnd.google.note"?/>???
  • ??????</intent-filter>???
  • ??????<intent-filter>???
  • ????????<action?android:value="android.intent.action.GET_CONTENT"?/>???
  • ????????<category?android:value="android.intent.category.DEFAULT"?/>???
  • ????????<type?android:value="vnd.android.cursor.item/vnd.google.note"?/>???
  • ??????</intent-filter>???
  • ????</activity>???
  • ????<activity?class=".NoteEditor"="@string/title_note">???
  • ??????<intent-filter?android:label="@string/resolve_edit">???
  • ????????<action?android:value="android.intent.action.VIEW"/>???
  • ????????<action?android:value="android.intent.action.EDIT"/>???
  • ????????<category?android:value="android.intent.category.DEFAULT"?/>???
  • ????????<type?android:value="vnd.android.cursor.item/vnd.google.note"?/>???
  • ??????</intent-filter>???
  • ??????<intent-filter>???
  • ????????<action?android:value="android.intent.action.INSERT"/>???
  • ????????<category?android:value="android.intent.category.DEFAULT"?/>???
  • ????????<type?android:value="vnd.android.cursor.dir/vnd.google.note"?/>???
  • ??????</intent-filter>???
  • ????</activity>???
  • ????<activity?class=".TitleEditor"="@string/title_edit_title"???
  • android:theme="@android:style/Theme.Dialog">???
  • ??????<intent-filter?android:label="@string/resolve_title">???
  • ????????<action?android:value="com.google.android.notepad.action.EDIT_TITLE"/>???
  • ????????<category?android:value="android.intent.category.DEFAULT"?/>???
  • ????????<category?android:value="android.intent.category.ALTERNATIVE"?/>???
  • ????????<category?android:value="android.intent.category.SELECTED_ALTERNATIVE"/>???
  • ????????<type?android:value="vnd.android.cursor.item/vnd.google.note"?/>???
  • ??????</intent-filter>???
  • ????</activity>???
  • </application>???
  • </manifest>??
  • ?

    例子中的第一個Activity 是com.google.android.notepad.NotesList,它是應用的主入口,提供了三個功能,分別由三個 intent-filter進行描述:
    ? ?? ???1、第一個是進入便箋應用的頂級入口(action為android.app.action.MAIN)。類型為android.app.category.LAUNCHER表明這個Activity將在Launcher中列出。
    ? ?? ???2、第二個是,當type為vnd.android.cursor.dir/vnd.google.note(保存便箋記錄的目錄) 時,可以查看可用的便箋(action為android.app.action.VIEW),或者讓用戶選擇一個便箋并返回給調用者(action為 android.app.action.PICK)。
    ? ?? ???3、第三個是,當type為vnd.android.cursor.item/vnd.google.note時,返回給調用者一個用戶選擇的便箋(action為android.app.action.GET_CONTENT),而用戶卻不需要知道便箋從哪里讀取的。 有了這些功能,下面的Intent就會被解析到NotesList這個activity:

    ? ? * { action=android.app.action.MAIN }:與此Intent匹配的Activity,將會被當作進入應用的頂級入口。?

    ? ? * { 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"下的所有便箋的列表,使用者可以遍歷列表,并且察看某便箋的詳細信息。?

    ? ? * { action=android.app.action.PICK data=content://com.google.provider.NotePad/notes }:顯示"content://com.google.provider.NotePad/notes"下的便箋列表,讓用戶可以在列表中選擇一個,然后將選擇的便箋的 URL返回給調用者。?

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


    ? ?? ???第二個Activity是com.google.android.notepad.NoteEditor,它為用戶顯示一條便箋,并且允許 用戶修改這個便箋。它定義了兩個intent-filter,所以具有兩個功能。第一個功能是,當數(shù)據(jù)類型為 vnd.android.cursor.item/vnd.google.note時,允許用戶查看和修改一個便簽(action為 android.app.action.VIEW和android.app.action.EDIT)。第二個功能是,當數(shù)據(jù)類型為 vnd.android.cursor.dir/vnd.google.note,為調用者顯示一個新建便箋的界面,并將新建的便箋插 入到便箋列表中(action為android.app.action.INSERT)。

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

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

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

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


    ? ?? ???最后一個Activity是com.google.android.notepad.TitleEditor,它允許用戶編輯便箋的標題。它可以被實現(xiàn)為 一個應用可以直接調用(在Intent中明確設置component屬性)的類,不過這里我們將為你提供一個在現(xiàn)有的數(shù)據(jù)上發(fā)布可選操作的方法。在這個 Activity的唯一的intent-filter中,擁有一個私有的action: com.google.android.notepad.action.EDIT_TITLE,表明允許用戶編輯便箋的標題。和前面的view和edit 動作一樣,調用這個Intent 的時候,也必須指定具體的便箋(type為vnd.android.cursor.item/vnd.google.note)。不同的是,這里顯示和編 輯的只是便箋數(shù)據(jù)中的標題。
    ? ?? ?除了支持缺省類別(android.intent.category.DEFAULT),標題編輯器還支持另外兩個標準類別: android.intent.category.ALTERNATIVE和 android.intent.category.SELECTED_ALTERNATIVE。實現(xiàn)了這兩個類別之后,其它 Activity就可以調用queryIntentActivityOptions(ComponentName, Intent[], Intent, int)查詢這個Activity提供的action,而不需要了解它的具體實現(xiàn);或者調用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} }:顯示并且允許用戶編輯標識為ID的便箋的標題。



    Intent解析機制

    Intent解析機制主要是通過查找已注冊在AndroidManifest.xml中的所有<intent-filter>及其中定義的Intent,通過PackageManager(注:PackageManager能夠得到當前設備上所安裝的
    application package的信息)來查找能處理這個Intent的component。在這個解析過程中,Android是通過Intent的action、type、category這三個屬性來進行判斷的,判斷方法如下:
    1.1? 如果Intent指明定了action,則目標組件的IntentFilter的action列表中就必須包含有這個action,否則不能匹配;
    1.2? 如果Intent沒有提供type,系統(tǒng)將從data中得到數(shù)據(jù)類型。和action一樣,目標組件的數(shù)據(jù)類型列表中必須包含Intent的數(shù)據(jù)類型,否則不能匹配。
    1.3? 如果Intent中的數(shù)據(jù)不是content:類型的URI,而且Intent也沒有明確指定type,將根據(jù)Intent中數(shù)據(jù)的scheme(比如 http:或者mailto:)進行匹配。同上,Intent 的scheme必須出現(xiàn)在目標組件的scheme列表中。
    1.4 如果Intent指定了一個或多個category,這些類別必須全部出現(xiàn)在組建的類別列表中。比如Intent中包含了兩個類別:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目標組件必須至少包含這兩個類別。



    Intent是不同組件之間相互通訊的紐帶,封裝了不同組件之間通訊的條件。Intent本身是定義為一個類別(Class),一個Intent對象表達一個目的(Goal)或期望(Expectation),敘述其所期望的服務或動作、與動作有關的數(shù)據(jù)等。Android則根據(jù)此Intent對象之敘述,負責配對,找出相配的組件,然后將 Intent對象傳遞給所找到的組件,Android的媒婆任務就完成了。

    ?

    在Google Doc中是這樣描述Intent的(摘自Android中文翻譯組)
    當接收到ContentResolver發(fā)出的請求后,內容提供者被激活。而其它三種組件──activity、服務和廣播接收器被一種叫做intent的異步消息所激活。intent是一個保存著消息內容的Intent對 象。對于activity和服務來說,它指明了請求的操作名稱以及作為操作對象的數(shù)據(jù)的URI和其它一些信息。比如說,它可以承載對一個activity 的請求,讓它為用戶顯示一張圖片,或者讓用戶編輯一些文本。而對于廣播接收器而言,Intent對象指明了聲明的行為。比如,它可以對所有感興趣的對象聲 明照相按鈕被按下。

    對于每種組件來說,激活的方法是不同的:
    1.通過傳遞一個Intent對象至 Context.startActivity()或Activity.startActivityForResult()以載入(或指定新工作給)一個activity。相應的activity可以通過調用 getIntent() 方法來查看激活它的intent。Android通過調用activity的onNewIntent()方法來傳遞給它繼發(fā)的intent。

    一個activity經(jīng)常啟動了下一個。如果它期望它所啟動的那個activity返回一個結果,它會以調用startActivityForResult()來取代startActivity()。比如說,如果它啟動了另外一個activity以使用戶挑選一張照片,它也許想知道哪張照片被選中了。結果將會被封裝在一個Intent對象中,并傳遞給發(fā)出調用的activity的onActivityResult() 方法。

    2.通過傳遞一個Intent對象至Context.startService()將啟動一個服務(或給予正在運行的服務以一個新的指令)。Android調用服務的onStart()方法并將Intent對象傳遞給它。

    與此類似,一個Intent可以被調用組件傳遞給 Context.bindService()以獲取一個正在運行的目標服務的連接。這個服務會經(jīng)由onBind() 方法的調用獲取這個Intent對象(如果服務尚未啟動,bindService()會先啟動它)。比如說,一個activity可以連接至前述的音樂回放服務,并提供給用戶一個可操作的(用戶界面)以對回放進行控制。這個activity可以調用 bindService() 來建立連接,然后調用服務中定義的對象來影響回放。

    3.應用程序可以憑借將Intent對象傳遞給 Context.sendBroadcast() ,Context.sendOrderedBroadcast(), 以及Context.sendStickyBroadcast()和其它類似方法來產(chǎn)生一個廣播。Android會調用所有對此廣播有興趣的廣播接收器的 onReceive()方法將intent傳遞給它們。

    ?

    Intent對象包含的內容

    在Intent類的Java源代碼中定義了Intent相關內容的變量,如下:

    [java]?view plaincopy
  • //?Action??
  • private?String?mAction;??
  • //?Data??
  • private?Uri?mData;??
  • private?String?mType;??
  • private?String?mPackage;??
  • //?ComponentName??
  • private?ComponentName?mComponent;??
  • //?Flag??
  • private?int?mFlags;??
  • //?category??
  • private?HashSet<String>?mCategories;??
  • //?extras??
  • private?Bundle?mExtras;??
  • 1.componentName(組件名稱),指定Intent的目標組件的類名稱。組件名稱是可選的,如果填寫,Intent對象會發(fā)送給指定組件名稱的組件,否則也可以通過其他Intent信息定位到適合的組件。組件名稱是個ComponentName類型的對象。
    用法:

    ?

    [java]?view plaincopy
  • Intent?intent?=?new?Intent();??
  • //?構造的參數(shù)為當前Context和目標組件的類路徑名??
  • ComponentName?cn?=?new?ComponentName(HelloActivity.this,?"com.byread.activity.OtherActivity");??
  • intent.setComponent(cn);??
  • startActivity(intent);??
  • 相當于以下常用方法:
    [java]?view plaincopy
  • Intent?intent?=?new?Intent();??
  • intent.setClass(HelloActivity.this,?OtherActivity.class);??
  • startActivity(intent);??
  • Intent類中也包含一個初始化ComponentName的構造函數(shù):?

    [java]?view plaincopy
  • public?Intent(Context?packageContext,?Class<?>?cls)?{??
  • ????mComponent?=?new?ComponentName(packageContext,?cls);??
  • }??
  • ?

    2.action(動作),指定Intent的執(zhí)行動作,比如調用撥打電話組件。?

    [java]?view plaincopy
  • public?Intent(String?action)?{??
  • ????mAction?=?action;??
  • }??
  • ?

    3.data(數(shù)據(jù)),起到表示數(shù)據(jù)和數(shù)據(jù)MIME類型的作用。不同的action是和不同的data類型配套的,通過設置data的Uri來獲得。?

    [java]?view plaincopy
  • public?Intent(String?action,?Uri?uri)?{??
  • ????mAction?=?action;??
  • ????mData?=?uri;??
  • }??
  • 比如調用撥打電話組件:

    [java]?view plaincopy
  • Uri?uri?=?Uri.parse("tel:10086");??
  • //?參數(shù)分別為調用撥打電話組件的Action和獲取Data數(shù)據(jù)的Uri??
  • Intent?intent?=?new?Intent(Intent.ACTION_DIAL,?uri);??
  • startActivity(intent);??
  • ?

    4.category(類別),被執(zhí)行動作的附加信息。例如應用的啟動Activity在intent-filter中設置category。

    [xhtml]?view plaincopy
  • <intent-filter>??
  • ????<action?android:name="android.intent.action.MAIN"?/>??
  • ????<category?android:name="android.intent.category.LAUNCHER"?/>??
  • </intent-filter>??
  • ?

    5.extras(附加信息),為處理Intent組件提供附加的信息。可通過putXX()和getXX()方法存取信息;也可以通過創(chuàng)建Bundle對象,再通過putExtras()和getExtras()方法來存取。?

    ?

    6.flags(標記),指示Android如何啟動目標Activity,設置方法為調用Intent的setFlags方法。常用的Flags參數(shù)有:

    FLAG_ACTIVITY_CLEAR_TOP
    FLAG_ACTIVITY_NEW_TASK
    FLAG_ACTIVITY_NO_HISTORY
    FLAG_ACTIVITY_SINGLE_TOP??

    ?

    Intent的投遞

    1.顯式方式。直接設置目標組件的ComponentName,用于一個應用內部的消息傳遞,比如啟動另一個Activity或者一個services。
    通過Intent的setComponent和setClass來制定目標組件的ComponentName。

    ?

    2.隱式方式。ComponentName為空,用于調用其他應用中的組件。需要包含足夠的信息,這樣系統(tǒng)才能根據(jù)這些信息使用intent filter在所有的組件中過濾action、data或者category來匹配目標組件。可參考Android中Activity組件詳解(5.Activity的Intent Filter)
    如果Intent指明定了action,則目標組件的IntentFilter的action列表中就必須包含有這個action,否則不能匹配;
    如果Intent沒有提供type,系統(tǒng)將從data中得到數(shù)據(jù)類型。和action一樣,目標組件的數(shù)據(jù)類型列表中必須包含Intent的數(shù)據(jù)類型,否則不能匹配;
    如果Intent中的數(shù)據(jù)不是content: 類型的URI,而且Intent也沒有明確指定它的type,將根據(jù)Intent中數(shù)據(jù)的scheme (比如 http: 或者mailto: ) 進行匹配。同上,Intent 的scheme必須出現(xiàn)在目標組件的scheme列表中;
    如果Intent指定了一個或多個category,這些類別必須全部出現(xiàn)在組建的類別列表中。比如 Intent中包含了兩個類別:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目標組件必須至少包含這兩個類別。

    ?

    Intent調用常見系統(tǒng)組件?

    [java]?view plaincopy
  • //?調用瀏覽器??
  • Uri?webViewUri?=?Uri.parse("http://blog.csdn.net/zuolongsnail");??
  • Intent?intent?=?new?Intent(Intent.ACTION_VIEW,?webViewUri);??
  • ??
  • //?調用地圖??
  • Uri?mapUri?=?Uri.parse("geo:100,100");??
  • Intent?intent?=?new?Intent(Intent.ACTION_VIEW,?mapUri);??
  • ??
  • //?播放mp3??
  • Uri?playUri?=?Uri.parse("file:///sdcard/test.mp3");??
  • Intent?intent?=?new?Intent(Intent.ACTION_VIEW,?playUri);??
  • intent.setDataAndType(playUri,?"audio/mp3");??
  • ??
  • //?調用撥打電話??
  • Uri?dialUri?=?Uri.parse("tel:10086");??
  • Intent?intent?=?new?Intent(Intent.ACTION_DIAL,?dialUri);??
  • //?直接撥打電話,需要加上權限<uses-permission?id="android.permission.CALL_PHONE"?/>??
  • Uri?callUri?=?Uri.parse("tel:10086");??
  • Intent?intent?=?new?Intent(Intent.ACTION_CALL,?callUri);??
  • ??
  • //?調用發(fā)郵件(這里要事先配置好的系統(tǒng)Email,否則是調不出發(fā)郵件界面的)??
  • Uri?emailUri?=?Uri.parse("mailto:zuolongsnail@163.com");??
  • Intent?intent?=?new?Intent(Intent.ACTION_SENDTO,?emailUri);??
  • //?直接發(fā)郵件??
  • Intent?intent?=?new?Intent(Intent.ACTION_SEND);??
  • String[]?tos?=?{?"zuolongsnail@gmail.com"?};??
  • String[]?ccs?=?{?"zuolongsnail@163.com"?};??
  • intent.putExtra(Intent.EXTRA_EMAIL,?tos);??
  • intent.putExtra(Intent.EXTRA_CC,?ccs);??
  • intent.putExtra(Intent.EXTRA_TEXT,?"the?email?text");??
  • intent.putExtra(Intent.EXTRA_SUBJECT,?"subject");??
  • intent.setType("text/plain");??
  • Intent.createChooser(intent,?"Choose?Email?Client");??
  • ??
  • //?發(fā)短信??
  • Intent?intent?=?new?Intent(Intent.ACTION_VIEW);??
  • intent.putExtra("sms_body",?"the?sms?text");??
  • intent.setType("vnd.android-dir/mms-sms");??
  • //?直接發(fā)短信??
  • Uri?smsToUri?=?Uri.parse("smsto:10086");??
  • Intent?intent?=?new?Intent(Intent.ACTION_SENDTO,?smsToUri);??
  • intent.putExtra("sms_body",?"the?sms?text");??
  • //?發(fā)彩信??
  • Uri?mmsUri?=?Uri.parse("content://media/external/images/media/23");??
  • Intent?intent?=?new?Intent(Intent.ACTION_SEND);??
  • intent.putExtra("sms_body",?"the?sms?text");??
  • intent.putExtra(Intent.EXTRA_STREAM,?mmsUri);??
  • intent.setType("image/png");??
  • ??
  • //?卸載應用??
  • Uri?uninstallUri?=?Uri.fromParts("package",?"com.app.test",?null);??
  • Intent?intent?=?new?Intent(Intent.ACTION_DELETE,?uninstallUri);??
  • //?安裝應用??
  • Intent?intent?=?new?Intent(Intent.ACTION_VIEW);??
  • intent.setDataAndType(Uri.fromFile(new?File("/sdcard/test.apk"),?"application/vnd.android.package-archive");??
  • ??
  • //?在Android?Market中查找應用??
  • Uri?uri?=?Uri.parse("market://search?q=憤怒的小鳥");???????????
  • Intent?intent?=?new?Intent(Intent.ACTION_VIEW,?uri);??


  • 轉自:http://blog.csdn.net/t12x3456/article/details/7688154 ?

    ? ? ? ? ? ??http://blog.csdn.net/zuolongsnail/article/details/6574211

    總結

    以上是生活随笔為你收集整理的Android Intent机制详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。