成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳細(xì)分析IntentFilter的匹配規(guī)則

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

[[430933]]

前言

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

今天我們就來講解下;

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

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

1、顯式調(diào)用

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

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

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

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

2、隱式調(diào)用

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

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

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

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

  • action是一個(gè)字符串,系統(tǒng)預(yù)定義了一些action,同時(shí)我們也可以在應(yīng)用中定義自己的action;
  • 它的匹配規(guī)則是Intent中的action必須能夠和過濾規(guī)則中的action匹配,這里說的是指action的字符串值完全一樣;
  • action中的內(nèi)容是區(qū)分大小寫的;
  • Intent中如果沒有指定action,則視為匹配失敗;
  • 一個(gè)過濾規(guī)則中有多個(gè)action,那么只要Intent中的action能夠和Activity過濾規(guī)則中的任何一個(gè)action相同即可匹配成功;

  1.  <activity android:name=".BActivity" > 
  2.             <intent-filter> 
  3.                 <action android:name="com.ysl.test"/> 
  4.                 <action android:name="com.ysl.test1"/> 
  5.                 //必須添加category android:name="android.intent.category.DEFAULT"否則報(bào)錯(cuò) 
  6.                 <category android:name="android.intent.category.DEFAULT"/> 
  7.             </intent-filter> 
  8.         </activity> 
  9.         <activity android:name=".AActivity" > 
  10.             <intent-filter> 
  11.                 <action android:name="android.intent.action.MAIN" /> 
  12.                 <category android:name="android.intent.category.LAUNCHER" /> 
  13.             </intent-filter> 
  14.         </activity> 
  15. btn_skip_b.setOnClickListener { 
  16.             //A中點(diǎn)擊按鈕啟動(dòng)B 
  17.             var intent = Intent() 
  18.             intent.action = "com.ysl.test" 
  19.             startActivity(intent) 
  20.         } 

常見action如下(Intent類中的常量)

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

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

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

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

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

  1. <!--SecondActivity的intent-filter--> 
  2. <intent-filter> 
  3.  <action android:name="com.axe.mg.what" /> 
  4.  <category android:name="com.yu.hu.category1"/> 
  5.  <category android:name="com.yu.hu.category2"/> 
  6.  <category android:name = "android.intent.category.DEFAULT" /> 
  7. </intent-filter> 
  8. <!--ThirdActivity的intent-filter--> 
  9. <intent-filter> 
  10.  <action android:name="com.axe.mg.what" /> 
  11.  <category android:name = "android.intent.category.DEFAULT" /> 
  12.  <category android:name="com.yu.hu.category1"/> 
  13.  <category android:name="com.yu.hu.category2"/> 
  14.  <category android:name="com.yu.hu.category3"/> 
  15. </intent-filter> 
  16. <!--FourthActivity的intent-filter--> 
  17. <intent-filter> 
  18.  <action android:name="com.axe.mg.what" /> 
  19.  <category android:name = "android.intent.category.DEFAULT" /> 
  20.  <category android:name="com.yu.hu.category2"/> 
  21. </intent-filter> 
  22. Intent intent = new Intent(); 
  23. intent.addCategory("com.yu.hu.category1"); 
  24. intent.addCategory("com.yu.hu.category2"); 
  25. intent.setAction("com.yu.hu.what"); 
  26. startActivity(intent); 

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

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

data的語法格式

  1. <data android:scheme="string" 
  2.     android:host="string" 
  3.     android:port="string" 
  4.     android:path="string" 
  5.     android:pathPattern="string" 
  6.     android:pathPrefix="string" 
  7.     android:mimeType="string" /> 

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

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

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

  • mimeType:指媒體類型,比如 image/jpeg、audio/mpeg4-generic、vidio/等,可以表示圖片、文本、視頻等不同的媒體格式;
  • scheme:URI的模式,如http、file、content等,如果URI中沒有指定scheme,那么整個(gè)URI的其他參數(shù)無效,這也意味著URI是無效的;
  • host:URI的主機(jī)名,如blog.csdn.net,如果host未指定,那么整個(gè)URI中的其他參數(shù)無效,這也意味著URI是無效的;
  • 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 中沒有為data設(shè)置URI,也需要在匹配的時(shí)候設(shè)置scheme和host兩個(gè)屬性,且scheme屬性的值必須是content或者file;

  1. <intent-filter> 
  2.    <action android:name="xx" /> 
  3.    <category android:name="android.intent.category.DEFAULT" /> 
  4.    <data 
  5.      android:host="www.baidu.com" 
  6.      android:pathPrefix="/imgs" 
  7.      android:port="8080" 
  8.      android:scheme="https" /> 
  9.  </intent-filter> 
  10.   Intent intent = new Intent(); 
  11.   intent.setData(Uri.parse("https://www.baidu.com:8080/imgs/img1.png")); 
  12.   startActivity(intent); 

三、IntentFilter總結(jié)

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

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

2、隱式intent;

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

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

  1. <activity android:name="com..test.MainActivity"
  2.      <intent-filter>   
  3.            <action android:name="com.test.test" /> 
  4.            <category android:name="android.intent.category.DEFAULT" /> 
  5.  </intent-filter>  
  6. </activity> 

總結(jié)

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

本文轉(zhuǎn)載自微信公眾號(hào)「Android開發(fā)編程」

 

責(zé)任編輯:姜華 來源: Android開發(fā)編程
相關(guān)推薦

2009-09-25 14:23:39

2009-09-28 10:39:01

Hibernate基礎(chǔ)

2009-06-18 14:00:51

2009-12-03 17:41:40

PHP應(yīng)用發(fā)展

2010-04-26 18:17:19

Oracle存儲(chǔ)過程

2009-09-14 13:50:35

LINQ編程模型

2009-09-08 15:56:50

Linq使用Group

2010-01-06 13:50:37

.NET Framew

2009-11-20 13:11:44

Oracle XML數(shù)

2009-09-09 09:48:43

Linq延遲加載

2009-09-14 16:21:34

LINQ To XML

2009-10-10 13:52:57

VB Update方法

2010-03-08 17:18:46

Linux du命令

2010-04-12 10:53:07

Oracle SQL

2010-04-26 14:32:21

Oracle SQL

2010-07-02 11:19:31

IP協(xié)議頭格式

2010-01-06 16:12:52

分析Json stri

2009-09-07 14:18:01

C#內(nèi)存管理

2009-09-09 13:53:21

Linq表值函數(shù)

2009-10-28 10:06:29

VB.NET With
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 亚洲精品欧美 | 国产一区二区精品在线观看 | 亚洲成人免费电影 | 成人精品一区二区三区中文字幕 | 波多野结衣先锋影音 | 一级欧美 | 国产日韩欧美电影 | 欧美综合在线观看 | 婷婷99| 男女视频在线免费观看 | 日韩精品一区二区三区中文字幕 | 日本成人三级电影 | 水蜜桃久久夜色精品一区 | 91免费观看国产 | 日本在线一区二区三区 | 好好的日在线视频 | 国产中文字幕网 | 日本免费一区二区三区 | 精品一区二区久久 | 国产日韩欧美 | 国产成人在线视频 | 性高湖久久久久久久久3小时 | 欧美乱码精品一区二区三区 | 香蕉二区| 久久九九影视 | 成人在线网 | 亚洲精品一区在线 | 爱综合| 色www精品视频在线观看 | 日韩在线不卡视频 | 国产一区二区精品在线观看 | 日本一区二区电影 | 国产网站在线免费观看 | 久久出精品 | av手机免费在线观看 | 国产高清精品一区二区三区 | 欧美精品中文字幕久久二区 | 免费视频一区二区 | 色综合久 | 色久在线| 欧美一区在线视频 |