Intent 與 IntentFilter 詳解


在前面的章節咱們介紹到了 Activity、Service、BroadCastReceiver,這三者的啓動、數據的傳遞都用到了 Intent,足以可見 Intent 在 Andorid 的重要性。Intent 這個英語單詞的本意是「目的、意向、意圖」。Intent 是一種運行時綁定(runtime binding)機制,它能在程序運行的過程當中鏈接兩個不一樣的組件。經過 Intent,你的程序能夠向 Android 表達某種請求或者意願,Android 會根據意願的內容選擇適當的組件來響應。android

目錄

-顯示瀏覽器

-隱示bash

-屬性ide

-匹配規則函數

-PendingIntentspa

Intent 分爲兩種類型,分別爲顯示和隱示,下面將分別介紹code

顯示

顯式 Intent,能夠經過類名來找到相應的組件,在應用中用顯式 Intent 去啓動一個組件,一般是由於咱們知道這個組件(Activity、Service)的名字。以下代碼,咱們知道具體的 Activity 的名字,要啓動一個新的 Activity,下面就是用的顯示 Intent。component

Intent intent = new Intent(context,AActivity.class);
startActivity(intent);
複製代碼

隱示

隱式 Intent,不指定具體的組件,可是它會聲明將要執行的操做,從而匹配到相應的組件。最簡單的 Android 中調用系統撥號頁面準備打電話的操做,就是隱式 Intent。視頻

Intent intent = new Intent(Intent.ACTION_DIAL);
Uri data = Uri.parse("tel:" + "13888888888");
intent.setData(data);
startActivity(intent);
複製代碼

使用隱式 Intent 的時候,系統經過將 Intent 對象中的 IntentFilter 與組件在 AndroidManifest.xml 或者代碼中動態聲明的 IntentFilter 進行比較,從而找到要啓動的相應組件。若是組件的 IntentFilter 與 Intent 中的 IntentFilter 正好匹配,系統就會啓動該組件,並把 Intent 傳遞給它。若是有多個組件同時匹配到了,系統則會彈出一個選擇框,讓用戶選擇使用哪一個應用去處理這個 Intent,好比有時候點擊一個網頁連接,會彈出多個應用,讓用戶選擇用哪一個瀏覽器去打開該連接,就是這種狀況。隱式 Intent 啓動固定 Activity。xml

AndroidManifest.xml 中註冊

<activity
    android:name=".SecondActivity">
    <intent-filter>
        <action android:name="com.madreain.intent.MY_ACTION"/>
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
複製代碼

隱式 Intent 啓動 Activity 代碼

Intent intent = new Intent();
//設置動做(實際action屬性就是一個字符串標記而已)
intent.setAction("com.madreain.intent.MY_ACTION");
tartActivity(intent);

複製代碼

上面隱式 Intent 啓動 Activity 提到了 action 屬性,接下來來詳細介紹一下 Intent 的相關屬性

屬性

component(組件) 目的組件的名稱,這個只有顯式 Intent 有,隱式 Intent 沒有。例如:com.madreain.DemoActivity。該屬性能夠經過 setComonentName()、setClass()、setClassName()或者 Intent 的構造函數來設置。

action(動做) 用來表現意圖的行動,這個能夠用戶自定義也可使用系統中自帶的 Action 值。例如:com.madreain.intent.MY_ACTION"該屬性能夠經過 setAction()方法或者 Intent 的構造函數來設置。

系統中經常使用的 Action 值: ACTION_MAIN,標識 Activity 爲一個程序的開始 ACTION_VIEW,當有一些信息須要展現出來 ACTION_SEND,發送郵件 Action_CALL,呼叫指定的電話號碼 ACTION_DIAL,撥打電話 ACTION_EDIT,編輯某些文件 ALL_APPS,列出全部的應用 ACTION_ANSWER,處理呼入的電話

category(類別) 用來表現動做的類別,它是一個 ArraySet 類型的容器,因此能夠向裏面添加任意數量的補充信息,同時,Intent 沒有設置這個屬性不會影響解析組件信息。能夠經過 addCategory()方法來設置該屬性

經常使用的 Category 的值:

CATEGORY_LAUNCHER,應用啓動的初始 Activity,這個 Activity 會被添加到系統啓動 launcher 當中。 CATEGORY_BROWSABLE,設置 Category 爲該值後,在網頁上點擊圖片或連接時,系統會考慮將此目標 Activity 列入可選列表,供用戶選擇以打開圖片或連接。 CATEGORY_APP_EMAIL,用來啓動郵件應用程序

data(數據) 表示與動做要操縱的數據,它是待操做數據的引用 URI 或者數據 MIME 類型的 URI,它的值一般與 Intent 的 Action 有關聯。實際應用打開指定網頁

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
複製代碼

type(數據類型) 對於 data 範例的描寫,當Intent不指定Data屬性時,Type屬性纔會起做用,不然Android系統將會根據Data屬性值來分析數據的類型,因此無需指定Type屬性。data和type屬性通常只須要一個,經過setData方法會把type屬性設置爲null,相反設置setType方法會把data設置爲null,若是想要兩個屬性同時設置,要使用Intent.setDataAndType()方法

經常使用type類型: intent.setType(「image/」);//選擇照片 intent.setType(「audio/」); //選擇音頻 intent.setType(「video/」); //選擇視頻 (mp4 3gp 是android支持的視頻格式) intent.setType(「video/;image/*」);//同時選擇視頻和圖片

extras(擴展信息) 擴展信息,以key-value鍵值對的形式來存儲組件執行操做過程當中須要的額外信息,能夠調用putExtra()方法來設置該屬性,這個方法接受兩個參數,一個是key,一個是value。也能夠經過實例化一個儲存額外信息的Bundle對象,而後調用putExtras()方法將咱們實例化的Bundle添加到Intent中。

Flags(標誌位) 指望這個意圖的運行模式,這個屬性能夠指示系統如何啓動一個Activity,以及啓動以後如何處理

補充: Intent.createChooser():可用於啓動網頁強制每一次喚起選擇框 接受隱式Intent:咱們也能夠設置咱們能夠接受的文件的type,而後隱式Intent可以匹配到任意一個過濾器就能被啓動了

匹配規則

上面介紹了相關屬性,咱們知道當咱們發送一個隱式Intent後,系統會將它與設備中的每個組件的過濾器進行匹配,匹配屬性有Action、Category、Data三個,須要這三個屬性都匹配成功才能喚起相應的組件。接下來分別介紹Action、Category、Data的匹配規則

Action匹配規則

一個過濾器能夠不聲明Action屬性也能夠聲明多個Action屬性。隱式Intent中的Action屬性,與組件中的某一個過濾器的Action可以匹配(若是一個過濾器聲明瞭多個Action屬性,只須要匹配其中一個就行),這樣就算匹配成功。若是過濾器沒有聲明Action屬性,那麼只有沒有設置Action屬性的隱式Intent才能匹配成功。

Category匹配規則

一個過濾器能夠不聲明Category屬性也能夠聲明多個Category屬性。隱式Intent中聲明的Category必須所有可以與某一個過濾器中的Category匹配纔算匹配成功。好比說一個Category屬性設爲CATEGORY_BROWSABLE的隱式Intent也能夠經過上面的過濾器,也就是說,過濾器的Category屬性內容必須是大於或者等於隱式Intent的Category屬性時候,隱式Intent才能匹配成功。若是一個隱式Intent沒有設置Category屬性,那麼它能夠經過任何一個過濾器的Category匹配。

Data匹配規則

一個過濾器能夠不聲明Data屬性也能夠聲明多個Data屬性。每一個Data屬性均可以指定數據的URI結構和數據MIME類型。URI包括scheme、host、port 和path四個部分,host和port合起來也成authority(host:port)部分。

PendingIntent

說到了Intent,咱們就再來講說PendingIntent,PendingIntent是對Intent的一種封裝。用於處理即將發生的事情。好比在通知Notification中用於跳轉頁面,但不是立刻跳轉。

實例應用:Notification,SmsManager,AlarmManager等

相關文章
相關標籤/搜索