IntentFilter隐式匹配规则
启动Activity时一般有隐式匹配和显示匹配两种方法,这个重点讲一下Intent的隐式匹配规则,匹配规则主要分为三部分,action匹配,category匹配,和data匹配。
在正式说明匹配规则前需要知道以下几点:
- 一个Activity可以在AndroidMainFest文件中有多个intent-filiter,每个intent-filiter可以设定多个action,category和data
- 只有一个intent同时满足action,category和data的匹配规则时才算匹配成功。
匹配方式 | 匹配规则 |
---|
action匹配 | Intent的action必须和AndroidMainFest文件中intent-filiter设定的其中一个action相匹配 | category匹配 | intent拥有的多个category必须都要与清单文件里的匹配,在startActivity时系统会默认给Intent加上"android.intent.category.DEFAULT,这也是为什么intent不设置category时,有时也会匹配成功的原因 | data匹配 | intent中设置的data必须和AndroidMainFest文件中intent-filiter设定的其中一个data相匹配 |
data拥有很多的属性
属性 | 作用 |
---|
android:scheme | 协议,比如http,file,content等,其中content和file是默认值 | android:host | IP地址,比如www.baidu.com | android:port | 端口号 | android:path | 完整路径 | android:pathPattern | 也是完整路径只不过可以正则加通配符。比如“*”,表示0个或多个任意字符 | android:pathPrefix | 表示路径的前缀信息 |
scheme://host:port/[path | pathPattern | pathPrefix]
==注:==对与Service和BroadcastReceiver匹配规则也一样,只不过官方对于Service更建议使用显示的方式来启动服务。
匹配过程中的一些判断
ResolveInfo r = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
List<ResolveInfo> rs = getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
这两个方法的第二个参数一般是PackageManager.MATCH_DEFAULT_ONLY 因为在startActivity时会默认给Intent的category加上Default,如果你在AndroidManifest文件中没有加Default,就必然匹配失败。
举个例子 加入有一个Activity1,他的action是“a”, 他的category是“b”,你构建了以下Intent
Intent intent = new Intent("a");
intent.addCategory("b");
ResolveInfo r = getPackageManager().resolveActivity(intent,PackageManager.MATCH_ALL);
startActivity(intent);
如果第二个参数设置为Match_All,就算r不等于null,依然会匹配失败。因为漏算了startActivity给Intent加上的Default
|