欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android Intent-Filter匹配規(guī)則解析

 更新時(shí)間:2020年12月11日 15:05:54   作者:一只修仙的猿  
這篇文章主要介紹了Android Intent-Filter匹配規(guī)則的相關(guān)資料,幫助大家更好的進(jìn)行Android開(kāi)發(fā),感興趣的朋友可以了解下

前言

我們都知道,活動(dòng)的啟動(dòng)方式有兩種:一種是顯示啟動(dòng),或者很簡(jiǎn)單,指定一個(gè)活動(dòng)的class就可以了;另外一種就是隱式啟動(dòng),這種要指定action,category,data信息,例如我們?cè)趩?dòng)系統(tǒng)相機(jī)的時(shí)候。看一下代碼:

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
    startActivityForResult(intent,1);

其中的”android.media.action.IMAGE_CAPTURE”就是相機(jī)的action,這樣就可以啟動(dòng)相機(jī)了。
隱式啟動(dòng)我們?cè)谄綍r(shí)也用的比較少,對(duì)于自己應(yīng)用中的Activity都是直接顯示啟動(dòng)了。那什么時(shí)候用到隱式啟動(dòng)呢?一般是在啟動(dòng)別的應(yīng)用的activity的時(shí)候,例如上面講到的相機(jī)。
上面講到的action,category,data就是intent-filer,也就是過(guò)濾器,篩選要啟動(dòng)的activity。
intentFiler有什么用?就像給自己上個(gè)標(biāo)簽。例 如,你給自己上個(gè)標(biāo)簽是大學(xué)生,那么,當(dāng)說(shuō)學(xué)生出來(lái),欸那么就匹配到你了。這個(gè)就是intentfiler的作用。用于篩選匹配。
那么這三個(gè)action,category,data究竟是什么?他們的具體匹配規(guī)則又是什么樣的?上面講到intentFiler是用于啟動(dòng)別的應(yīng)用,有哪些常用的intentfiler可以使用?接下來(lái)我們就來(lái)看看。

intentFilter的結(jié)構(gòu)

前面講到intentFilter包含三個(gè):action,category,data,讓我看一下代碼熟悉一下:

<intent-filter>
    <action android:name="huan"/>
    <category android:name="android.intent.category.DEFAULT"/>
   </intent-filter>

另外包括我們最熟悉的:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>

這三個(gè)分別表示不同的意義。你想要啟動(dòng)什么樣的activity就通過(guò)設(shè)置這些屬性來(lái)啟動(dòng)到對(duì)應(yīng)的activity。當(dāng)我們自己設(shè)置intentFiler的時(shí)候也要注意他的意義性,雖然很多可以隨便設(shè)置,但是就像變量名稱一樣,不要隨便起。

Action

action是最簡(jiǎn)單也是最常用的。

  • 意義:這個(gè)參數(shù)表示啟動(dòng)這個(gè)活動(dòng)要干嘛。例如上面相機(jī)的是android.media.action.IMAGE_CAPTURE,很明顯就是拍照功能。action的本質(zhì)也是一個(gè)字符串,匹配就必須每個(gè)字符都一樣,包括大小寫(xiě)。上面說(shuō)過(guò),雖然可以隨便寫(xiě)這個(gè)字符串,但是要有意義。
  • 匹配規(guī)則:action的匹配規(guī)則也很簡(jiǎn)單,Intent中的action和intentFilter中的任意一個(gè)action匹配,那么匹配成功。但是如果Intent中的action是空的,那么匹配失敗。

Category

這個(gè)參數(shù)平時(shí)用得比較少,一般在一些比較特殊的情況才會(huì)用到

  • 意義:這個(gè)參數(shù)平常使用的意義是表示實(shí)現(xiàn)這個(gè)action動(dòng)作的類(lèi)別,也就是可以響應(yīng)這個(gè)Intent的組件類(lèi)別。例如上面的category android:name=”android.intent.category.LAUNCHER”,表示這個(gè)action將會(huì)在頂級(jí)執(zhí)行,什么意思呢?就是我們每次打開(kāi)應(yīng)用都會(huì)打開(kāi)的第一個(gè)activity。
  • 匹配規(guī)則:可以設(shè)置多個(gè)category。但是intent中的每一個(gè)category都必須和intentFilter中的其中一條category匹配才能匹配成功。
  • 注意:給activity設(shè)置intentFilter的時(shí)候,如果沒(méi)有其他的category,必須設(shè)置category android:name=”android.intent.category.DEFAULT”這個(gè)category。原因是startActivity或者starActivityForResult這兩個(gè)方法執(zhí)行的時(shí)候,如果intent中沒(méi)有category的話,那么就會(huì)自動(dòng)加上”android.intent.category.DEFAULT”這個(gè)category。

Data

data是三個(gè)中最復(fù)雜的一個(gè),顧名思義,這個(gè)參數(shù)就是用來(lái)傳遞數(shù)據(jù)的。data不同于前面兩個(gè),他由兩部分組成:Uri+mimeType.
我們先來(lái)看看data的組成:

<data android:scheme=""
     android:host=""
     android:port=""
     android:path=""
     android:pathPattern=""
     android:pathPrefix=""
     android:mimeType=""/>

data一共由7個(gè)參數(shù)組成,一起來(lái)看看分別是什么意思:

  • scheme:這個(gè)表示uri的模式,有最熟悉的http://這就是一種模式,另外安卓中還有比較常見(jiàn)的兩種是:content://和file://。有學(xué)過(guò)ContentProvider的讀者應(yīng)該對(duì)content模式就很熟悉了。
  • host,port:host是主機(jī),port是端口號(hào),這兩個(gè)合稱authority。例如www.baidu.com這個(gè)應(yīng)該就很熟悉了吧。在ContentProvider中表示哪一個(gè)contentProvider。
  • path,pathPattern,pathPrefix:這三個(gè)表示路徑信息。一是完整的路徑,二是可以用通配符來(lái)表示例如image/*,三是路徑的前綴。
  • mimeType:這個(gè)表示媒體類(lèi)型。例如image/jpeg

講完他的結(jié)構(gòu)后,有的讀者可能會(huì)發(fā)現(xiàn),這個(gè)data不就是一個(gè)地址+文件類(lèi)型嗎?是的,uri本身就是地址的意思。我們平時(shí)什么時(shí)候用到data呢?舉個(gè)例子,我們調(diào)用相機(jī)拍照并存儲(chǔ)到指定的文件夾,那么怎么讓相機(jī)知道地址呢?就是data了,我們通過(guò)intent啟動(dòng)相機(jī),并把地址放在data傳輸過(guò)去。這里的uri還涉及到安卓版本的影響有所不用,有興趣的讀者可以去了解一下。

那么,data的匹配規(guī)則是怎么樣的呢?
和action是一樣的,要求intent中必須要有data,而且和intentFilter中的一個(gè)相匹配就可以匹配成功。

  • 注意:如果在intentFilter中的data沒(méi)有設(shè)置uri,那么默認(rèn)的schme就是content和file。

設(shè)置intentFilter

看完了上面知道intentFilter中的三個(gè)參數(shù)怎么去匹配了,那怎么給活動(dòng)設(shè)置intentFilter,怎么給intent傳輸參數(shù)知道嗎?這個(gè)比較簡(jiǎn)單也簡(jiǎn)單講一下:
給活動(dòng)設(shè)置intentFilter比較簡(jiǎn)單,只要在AndroidManifest中設(shè)置就可以了,看示例代碼:

<activity android:name=".MainActivity">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>

給intent設(shè)置參數(shù)也不難,一個(gè)一個(gè)來(lái)看:

  • action:可以在新建Intent對(duì)象的時(shí)候順便寫(xiě)進(jìn)去,例如:Intent intent = new Intent("android.intent.action.GET_CONTENT");或者調(diào)用Intent的setAction方法:intent.setAction("android.intent.action.GET_CONTENT");
  • caterogy:通過(guò)intent的方法intent.addCategory();
  • data:這個(gè)比較特殊一點(diǎn)因?yàn)樗袃蓚€(gè)部分:uri和mimeType。有三個(gè)方法:其中setType和setData分別是設(shè)置mimeType和uri的。但是這兩個(gè)方法都分別會(huì)清空另一個(gè)的數(shù)據(jù)。什么意思呢?例如我通過(guò)setData設(shè)置了一個(gè)uri,然后再通過(guò)setType設(shè)置一個(gè)mimeType,那么第一個(gè)的uri就會(huì)不見(jiàn)了,被刪除了。所以就有第三個(gè)方法:intent.setDataAndType。這個(gè)方法接受兩個(gè)參數(shù),uri和mimeType,同時(shí)設(shè)置兩個(gè)參數(shù),就不會(huì)被清除了。

常用的intentFilter

上面講到intentFilter主要是用來(lái)啟動(dòng)別的應(yīng)用的,例如相機(jī),電話,那么有什么是比較常用的呢?具體可以查看這篇博客android 常用URI 值得記住。不懂得也可以百度或者評(píng)論區(qū)留言。

小結(jié)

我們上面講到intentFilter可以用來(lái)篩選要啟動(dòng)的activity,同樣對(duì)于service和broadcast也是一樣,也同樣可以給他們?cè)O(shè)置intentFilter來(lái)隱式啟動(dòng)對(duì)應(yīng)的組件。而平時(shí)用的最多還是隱式啟動(dòng)活動(dòng),特別是在調(diào)用別的應(yīng)用的活動(dòng)的時(shí)候。要掌握一些常見(jiàn)的調(diào)用,這也是很重要的。
同時(shí)intentFilter的匹配規(guī)則也是很重要,熟記才不會(huì)在自己設(shè)置intentFilter的時(shí)候出錯(cuò)。
其中還有很多細(xì)節(jié)沒(méi)有講清楚,有疑問(wèn)的讀者可以評(píng)論區(qū)留言。

以上就是Android Intent-Filer匹配規(guī)則解析的詳細(xì)內(nèi)容,更多關(guān)于Android Intent-Filer匹配規(guī)則的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論