Android学习笔记28——IntentFilter的匹配规则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengxu_kuangrexintu/article/details/84080798

前言

在日常的Android开发中,我们会用到IntentFilter的匹配规则。IntentFilter的主要规则分为actioncategorydata三个类别,只有完美匹配才能成功启动目标Activity;下面来分享一下这三种IntentFilter的规则。

1.action的匹配规则

action是一个字符串,系统预定义了一些action,同时我们也可以在应用中定义自己的action。它的匹配规则是Intent中的action必须能够和过滤规则中的action匹配,这里说的是指action的字符串值完全一样。
【注意事项】

  • action中的内容是区分大小写的;
  • Intent中如果没有指定action,则视为匹配失败。

常见action如下(Intent类中的常量)

Intent.ACTION_MAIN,标识 Activity 为一个程序的开始

Intent.ACTION_VIEW,显示用户的数据

Intent.ACTION_DIAL,用户拨号面板

Intent.ACTION_SENDTO,发送消息

Intent.ACTION_PICK,从列表中选择信息,一般用于选择联系人或者图片等

Intent.ACTION_ANSWER,处理呼入的电话

Intent.ACTION_CHOOSER,显示一个Activity选择器,比如常见的选择分享到哪里

2.category的匹配规则

category是一个字符串。category的匹配规则是:Intent中可以没有category,但是如果一旦有category,不管有几个,每个都要能够和过滤规则中的任何一个category匹配。

【注意】
如果想让Activity A隐式启动Activity B,那么需要在Activity B的 intent-filter 中指定 android.intent.category.DEFAULT 这个category,原因是系统在调用 startActivity() 或者 startActivityForResult() 方法的时候会默认为Intent加上 android.intent.category.DEFAULT 这个category。

3.data的匹配规则

data的匹配规则:Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data。

data的语法格式

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

data由两部分组成: mimeTypeURIURI通过如下格式,包括schemehostportpathpathPrefixpathPattern

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
具体的参数解释

mimeType:指媒体类型,比如 image/jpeg、audio/mpeg4-generic、vidio/等,可以表示图片、文本、视频等不同的媒体格式;
scheme:URI的模式,如http、file、content等,如果URI中没有指定scheme,那么整个URI的其他参数无效,这也意味着URI是无效的;
host:URI的主机名,如blog.csdn.net,如果host未指定,那么整个URI中的其他参数无效,这也意味着URI是无效的;
port:URI中的端口号,比如80,进档URI中指定了scheme和host参数的时候,port参数才是有意义的;
path:表述路径的完整信息;
pathPrefix:表述路径的前缀信息;
pathPattern:表述路径的完整信息,但它里面可以包含通配符 * ,表示0个或任意字符(如果想要表示真是字符串,则需要转义成 \
; \ 要写成 \\ )。

我们可以通过 intent.setDataAndType(Uri.parse(“URI字符串”), “mimeType字符串”) 的格式为Intent设置data。

data的注意事项

  • URI可以不设置,但如果设置了,则 scheme 和 host 属性必须要设置;
  • URI的 scheme属性有默认值,默认值为content 或者 file,因此,就算在intent-filter 中没有为data设置URI,也需要在匹配的时候设置schemehost两个属性,且scheme属性的值必须是content或者file

IntentFilter常见问题汇总

1.path、pathPrefix、pathPattern 之间的区别

path 用来匹配完整的路径,如:http://example.com/blog/abc.html,这里将 path 设置为 /blog/abc.html 才能够进行匹配;
pathPrefix 用来匹配路径的开头部分,拿上来的 Uri 来说,这里将 pathPrefix 设置为 /blog 就能进行匹配了;
pathPattern 用表达式来匹配整个路径,这里需要说下匹配符号与转义。
匹配符号:
“” 用来匹配0次或更多,如:“a” 可以匹配“a”、“aa”、“aaa”…
“.” 用来匹配任意字符,如:“.” 可以匹配“a”、“b”,“c”…
因此 “.*” 就是用来匹配任意字符0次或更多,如:“.*html” 可以匹配 “abchtml”、“chtml”,“html”,“sdf.html”…
转义:因为当读取 Xml 的时候,“/” 是被当作转义字符的(当它被用作 pathPattern 转义之前),因此这里需要两次转义,读取 Xml 是一次,在 pathPattern 中使用又是一次。如:“” 这个字符就应该写成 “//”,“/” 这个字符就应该写成 “////”。

2.查询是否有Activity可以匹配我们指定Intent的组件

采用PackageManager的resolveActivity或者Intent的resolveActivity方法会获得最适合Intent的一个Activity 调用PackageManager的queryIntentActivities会返回所有成功匹配Intent的Activity。

3.android.intent.action.MAIN 与android.intent.category.LAUNCHER的区别

区别一

android.intent.action.MAIN决定一个应用程序最先启动那个组件
android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里(说白了就是是否在桌面上显示一个图标)
这两个属性组合情况:

  1. 有MAIN,无LAUNCHER,程序列表中无图标 。原因:android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里 ;
  2. 无MAIN,有LAUNCHER,程序列表中无图标 。原因:android.intent.action.MAIN决定应用程序最先启动的Activity,如果没有Main,则不知启动哪个Activity,故也不会有图标出现 。

所以这两个属性一般成对出现。 如果一个应用中有两个组件intent-filter都添加了android.intent.action.MAINndroid.intent.category.LAUNCHER这两个属性, 则这个应用将会显示两个图标, 写在前面的组件先运行。

区别二

android.intent.category.LAUNCHER:android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里,就是android开机后的主程序列表。
android.intent.category.HOME:按住“HOME”键,该程序显示在HOME列表里。

4.关于隐式intent

每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是 android.intent.category.DEFAULT,所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 android.intent.category.DEFAULTcategory,不然将导致 Intent 匹配失败.
比如说一个activity组件要想被其他组件通过隐式intent调用, 则其在AndroiddManifest.xml中的声明如下:

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

5.关于IntentFilter匹配优先级

首先查看Intent的过滤器(intent-filter),按照以下优先关系查找:action->data->category

猜你喜欢

转载自blog.csdn.net/chengxu_kuangrexintu/article/details/84080798