IntentFilter隐式匹配规则
匹配过程中的一些判断 IntentFilter隐式匹配规则
启动Activity时一般有隐式匹配和显示匹配两种方法,这个重点讲一下Intent的隐式匹配规则,匹配规则主要分为三部分,action匹配,category匹配,和data匹配。
在正式说明匹配规则前需要知道以下几点:
一个Activity可以在AndroidMainFest文件中有多个intent-filiter,每个intent-filiter可以设定多个action,category和data只有一个intent同时满足action,category和data的匹配规则时才算匹配成功。data拥有很多的属性
scheme://host:port/[path | pathPattern | pathPrefix]
==注:==对与Service和BroadcastReceiver匹配规则也一样,只不过官方对于Service更建议使用显示的方式来启动服务。
匹配过程中的一些判断 //判断是否该Intent可以隐式匹配成功,不成功返回null ResolveInfo r = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); //查找可以匹配成功的所有的Activity的信息 List
这两个方法的第二个参数一般是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