最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android?IntentFilter的匹配規(guī)則示例詳解

 更新時(shí)間:2022年12月09日 14:41:48   作者:Android開(kāi)發(fā)編程  
這篇文章主要為大家介紹了Android?IntentFilter的匹配規(guī)則示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

日常的Android開(kāi)發(fā)中,我們會(huì)用到IntentFilter的匹配規(guī)則。IntentFilter的主要規(guī)則分為action、category、data三個(gè)類(lèi)別,只有完美匹配才能成功啟動(dòng)目標(biāo)Activity;

今天我們就來(lái)講解下;

一、Activity的調(diào)用模式

Activity的調(diào)用模式有兩種:顯式調(diào)用和隱式調(diào)用;

1、顯式調(diào)用

大多數(shù)情況下我們最常接觸到的就是顯式調(diào)用了:

Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    startActivity(intent);

其實(shí)嚴(yán)格來(lái)講,這個(gè)也不算是顯式調(diào)用,因?yàn)樵陲@式調(diào)用的意義中需要明確之處被啟動(dòng)的對(duì)象的組件信息,包括包名和類(lèi)名,這里并沒(méi)有之處包名:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName("com.test","com.test.MainActivity");
    intent.setComponent(cn);
    startActivity(intent);

2、隱式調(diào)用

需要Intent能匹配目標(biāo)組件的IntentFilter中所設(shè)置的過(guò)濾信息.如果不匹配將無(wú)法啟動(dòng)目標(biāo)Activity;

Intent intent = new Intent(); intent.setAction("android.intent.action.View"); startActivity(intent);

二、IntentFilter匹配規(guī)則詳解

1、Action的匹配規(guī)則

  • action是一個(gè)字符串,系統(tǒng)預(yù)定義了一些action,同時(shí)我們也可以在應(yīng)用中定義自己的action;
  • 它的匹配規(guī)則是Intent中的action必須能夠和過(guò)濾規(guī)則中的action匹配,這里說(shuō)的是指action的字符串值完全一樣;
  • action中的內(nèi)容是區(qū)分大小寫(xiě)的;
  • Intent中如果沒(méi)有指定action,則視為匹配失??;
  • 一個(gè)過(guò)濾規(guī)則中有多個(gè)action,那么只要Intent中的action能夠和Activity過(guò)濾規(guī)則中的任何一個(gè)action相同即可匹配成功;
<activity android:name=".BActivity" >
<intent-filter>
<action android:name="com.ysl.test"/>
<action android:name="com.ysl.test1"/>
//必須添加category android:name="android.intent.category.DEFAULT"否則報(bào)錯(cuò)
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity android:name=".AActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
btn_skip_b.setOnClickListener {
//A中點(diǎn)擊按鈕啟動(dòng)B
var intent = Intent()
intent.action = "com.ysl.test"
startActivity(intent)
}

常見(jiàn)action如下(Intent類(lèi)中的常量)

  • Intent.ACTION_MAIN,標(biāo)識(shí) Activity 為一個(gè)程序的開(kāi)始
  • Intent.ACTION_VIEW,顯示用戶(hù)的數(shù)據(jù)
  • Intent.ACTION_DIAL,用戶(hù)撥號(hào)面板
  • Intent.ACTION_SENDTO,發(fā)送消息
  • Intent.ACTION_PICK,從列表中選擇信息,一般用于選擇聯(lián)系人或者圖片等
  • Intent.ACTION_ANSWER,處理呼入的電話(huà)
  • Intent.ACTION_CHOOSER,顯示一個(gè)Activity選擇器,比如常見(jiàn)的選擇分享到哪里

2、category的匹配規(guī)則

category是一個(gè)字符串,系統(tǒng)預(yù)定義了一些category,同時(shí)我們也可以在應(yīng)用中定義自己的category;

category的匹配規(guī)則是:

  • Intent中可以沒(méi)有category,但是如果一旦有category,不管有幾個(gè),每個(gè)都要能夠和過(guò)濾規(guī)則中的任何一個(gè)category匹配;
  • 一個(gè)Intent可以設(shè)置多個(gè)category,且Intent中的所有category都必須匹配到Activity中;
  • 也可以不設(shè)置category,這時(shí)系統(tǒng)會(huì)自動(dòng)匹配android.intent.category.DEFAULT;
  • 這里可能感覺(jué)和action很像,但是只要稍微注意一下就可以發(fā)現(xiàn)Intent是setAction和addCategory,也就是說(shuō)action只有一個(gè)(注意是一個(gè)Intent只有一個(gè)action,但是一個(gè)Activity的intent-filter中可以有多個(gè)action),而category可以有很多個(gè)且所有的category都必須出現(xiàn)在Activity的category集中;

注意:

  • 因?yàn)閺?qiáng)制要求一個(gè)Activity需要一個(gè),所以我們不用將這個(gè)categoty添加到intent中去匹配;
  • 如果單獨(dú)只addCategory是沒(méi)有用的,必須setAction之后才行;
<!--SecondActivity的intent-filter-->
<intent-filter>
<action android:name="com.axe.mg.what" />
<category android:name="com.yu.hu.category1"/>
<category android:name="com.yu.hu.category2"/>
<category android:name = "android.intent.category.DEFAULT" />
</intent-filter>
<!--ThirdActivity的intent-filter-->
<intent-filter>
<action android:name="com.axe.mg.what" />
<category android:name = "android.intent.category.DEFAULT" />
<category android:name="com.yu.hu.category1"/>
<category android:name="com.yu.hu.category2"/>
<category android:name="com.yu.hu.category3"/>
</intent-filter>
<!--FourthActivity的intent-filter-->
<intent-filter>
<action android:name="com.axe.mg.what" />
<category android:name = "android.intent.category.DEFAULT" />
<category android:name="com.yu.hu.category2"/>
</intent-filter>
Intent intent = new Intent();
intent.addCategory("com.yu.hu.category1");
intent.addCategory("com.yu.hu.category2");
intent.setAction("com.yu.hu.what");
startActivity(intent);

3、data的匹配規(guī)則

data的匹配規(guī)則:Intent中必須含有data數(shù)據(jù),并且data數(shù)據(jù)能夠完全匹配過(guò)濾規(guī)則中的某一個(gè)data;

data的語(yǔ)法格式

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

data由兩部分組成: mimeType和 URI,URI通過(guò)如下格式,包括scheme、host、port、path、pathPrefix和pathPattern;

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

具體的參數(shù)解釋:

  • mimeType:指媒體類(lèi)型,比如 image/jpeg、audio/mpeg4-generic、vidio/等,可以表示圖片、文本、視頻等不同的媒體格式;
  • scheme:URI的模式,如http、file、content等,如果URI中沒(méi)有指定scheme,那么整個(gè)URI的其他參數(shù)無(wú)效,這也意味著URI是無(wú)效的;
  • host:URI的主機(jī)名,如blog.csdn.net,如果host未指定,那么整個(gè)URI中的其他參數(shù)無(wú)效,這也意味著URI是無(wú)效的;
  • port:URI中的端口號(hào),比如80,進(jìn)檔URI中指定了scheme和host參數(shù)的時(shí)候,port參數(shù)才是有意義的;
  • path:表述路徑的完整信息;
  • pathPrefix:表述路徑的前綴信息;
  • pathPattern:表述路徑的完整信息,但它里面可以包含通配符 * ,表示0個(gè)或任意字符;

data的注意事項(xiàng)

  • URI可以不設(shè)置,但如果設(shè)置了,則 scheme 和 host 屬性必須要設(shè)置;
  • URI的 scheme屬性有默認(rèn)值,默認(rèn)值為content 或者 file,因此,就算在intent-filter 中沒(méi)有為data設(shè)置URI,也需要在匹配的時(shí)候設(shè)置scheme和host兩個(gè)屬性,且scheme屬性的值必須是content或者file;
<intent-filter>
<action android:name="xx" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="www.baidu.com"
android:pathPrefix="/imgs"
android:port="8080"
android:scheme="https" />
</intent-filter>
Intent intent = new Intent();
intent.setData(Uri.parse("https://www.baidu.com:8080/imgs/img1.png"));
startActivity(intent);

三、IntentFilter總結(jié)

1、IntentFilter匹配優(yōu)先級(jí)

查看Intent的過(guò)濾器(intent-filter),按照以下優(yōu)先關(guān)系查找:action->data->category;

2、隱式intent;

每一個(gè)通過(guò) startActivity() 方法發(fā)出的隱式 Intent 都至少有一個(gè) category,就是 android.intent.category.DEFAULT,所以只要是想接收一個(gè)隱式 Intent 的 Activity 都應(yīng)該包括 android.intent.category.DEFAULTcategory,不然將導(dǎo)致 Intent 匹配失敗

說(shuō)一個(gè)activity組件要想被其他組件通過(guò)隱式intent調(diào)用, 則其在AndroiddManifest.xml中的聲明如下:

<activity android:name="com..test.MainActivity">
<intent-filter>
<action android:name="com.test.test" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

總結(jié)

快年底了,大家要努力學(xué)習(xí),可以找個(gè)好工作;

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

相關(guān)文章

最新評(píng)論

阜城县| 加查县| 高淳县| 万宁市| 竹北市| 迁西县| 谢通门县| 广州市| 沙坪坝区| 临泉县| 三河市| 吴桥县| 凭祥市| 白银市| 山丹县| 闵行区| 梧州市| 泰宁县| 马山县| 宁阳县| 乌拉特前旗| 绥芬河市| 涞水县| 汉沽区| 五河县| 新宾| 东兰县| 嘉善县| 洛南县| 太仓市| 公主岭市| 漠河县| 金秀| 集贤县| 时尚| 新民市| 鸡西市| 科尔| 衡水市| 平谷区| 壶关县|