概述
前言
在日常的Android开发中,我们会用到IntentFilter的匹配规则。IntentFilter的主要规则分为action
、category
、data
三个类别,只有完美匹配才能成功启动目标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由两部分组成: mimeType
和 URI
,URI
通过如下格式,包括scheme
、host
、port
、path
、pathPrefix
和pathPattern
。
<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
,也需要在匹配的时候设置scheme
和host
两个属性,且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决定应用程序是否显示在程序列表里(说白了就是是否在桌面上显示一个图标)
这两个属性组合情况:
- 有MAIN,无LAUNCHER,程序列表中无图标 。原因:
android.intent.category.LAUNCHER
决定应用程序是否显示在程序列表里 ; - 无MAIN,有LAUNCHER,程序列表中无图标 。原因:
android.intent.action.MAIN
决定应用程序最先启动的Activity
,如果没有Main,则不知启动哪个Activity
,故也不会有图标出现 。
所以这两个属性一般成对出现。 如果一个应用中有两个组件intent-filter都添加了android.intent.action.MAIN
和 ndroid.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.DEFAULT
category,不然将导致 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
。
最后
以上就是懦弱绿草为你收集整理的Android学习笔记28——IntentFilter的匹配规则的全部内容,希望文章能够帮你解决Android学习笔记28——IntentFilter的匹配规则所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复