欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

IntentFilter隐式匹配规则

时间:2023-08-04
文章目录

IntentFilter隐式匹配规则

匹配过程中的一些判断 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:hostIP地址,比如www.baidu.comandroid:port端口号android:path完整路径android:pathPattern也是完整路径只不过可以正则加通配符。比如“*”,表示0个或多个任意字符android:pathPrefix表示路径的前缀信息

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

==注:==对与Service和BroadcastReceiver匹配规则也一样,只不过官方对于Service更建议使用显示的方式来启动服务。

匹配过程中的一些判断

//判断是否该Intent可以隐式匹配成功,不成功返回null ResolveInfo r = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); //查找可以匹配成功的所有的Activity的信息 List 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"); //判断是否该Intent可以隐式匹配成功,不成功返回nullResolveInfo r = getPackageManager().resolveActivity(intent,PackageManager.MATCH_ALL);startActivity(intent);

如果第二个参数设置为Match_All,就算r不等于null,依然会匹配失败。因为漏算了startActivity给Intent加上的Default

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。