8.2 Service匹配
PluginManager的resolveService方法调用流程图如下,
IpluginManagerImpl的resolveService方法如下,
List<ResolveInfo> infos = IntentMatcher.resolveServiceIntent(mContext, mPluginCache, intent, resolvedType, flags);
if (infos != null && infos.size() > 0) {
return IntentMatcher.findBest(infos);
}
直接调用的是IntentMatcher的resolveServiceIntent方法,主要逻辑如下,
1,对于有包名的intent,直接查找插件对应的包名的PluginPackageParser。
PluginPackageParser parser = pluginPackages.get(comp.getPackageName());
if (parser != null) {
queryIntentServiceForPackage(context, parser, intent, flags, list);
2,否则,对于每一个插件都得去匹配一下intent,展开地毯式搜索。
for (PluginPackageParser parser : pluginPackages.values()) {
queryIntentServiceForPackage(context, parser, intent, flags, list);
}
queryIntentServiceForPackage主要逻辑如下,
1,获取插件中的所有Service
List<ServiceInfo> serviceInfos = packageParser.getServices();
2,获取每个Service的所有IntentFilter,
if (serviceInfos != null && serviceInfos.size() >= 0) {
for (ServiceInfo serviceInfo : serviceInfos) {
ComponentName className = new ComponentName(serviceInfo.packageName, serviceInfo.name);
List<IntentFilter> intentFilters = packageParser.getServiceIntentFilter(className);
都是利用packageParser中的变量,这些变量在解析完成时赋值的。
3,对IntentFilter进行匹配
if (intentFilters != null && intentFilters.size() > 0) {
for (IntentFilter intentFilter : intentFilters) {
int match = intentFilter.match(context.getContentResolver(), intent, true, "");
if (match >= 0) {
ServiceInfo flagServiceInfo = packageParser.getServiceInfo(new ComponentName(serviceInfo.packageName, serviceInfo.name), flags);
if ((flags & PackageManager.MATCH_DEFAULT_ONLY) != 0) {
if (intentFilter.hasCategory(Intent.CATEGORY_DEFAULT)) {
ResolveInfo resolveInfo = newResolveInfo(flagServiceInfo, intentFilter);
resolveInfo.match = match;
resolveInfo.isDefault = true;
outList.add(resolveInfo);
} else {
//只是匹配默认。这里也算匹配不上。
}
} else {
ResolveInfo resolveInfo = newResolveInfo(flagServiceInfo, intentFilter);
resolveInfo.match = match;
resolveInfo.isDefault = false;
outList.add(resolveInfo);
}
•••
8.3 广播匹配
PluginManager的resolveService方法调用流程图如下,
IntentMatcher的resolveReceiverIntent方法,主要逻辑如下,
1,对于有包名的intent,直接查找插件对应的包名的PluginPackageParser。
PluginPackageParser parser = pluginPackages.get(comp.getPackageName());
if (parser != null) {
queryIntentReceiverForPackage (context, parser, intent, flags, list);
2,否则,对于每一个插件都得去匹配一下intent,展开地毯式搜索。
for (PluginPackageParser parser : pluginPackages.values()) {
queryIntentReceiverForPackage (context, parser, intent, flags, list);
}
queryIntentReceiverForPackage主要逻辑如下,
1,获取插件中的所有Receiver
List<ActivityInfo> receivers = packageParser.getReceivers();
2,获取每个Receiver的所有IntentFilter,
if (receivers != null && receivers.size() >= 0) {
for (ActivityInfo receiver : receivers) {
List<IntentFilter> intentFilters = packageParser.getReceiverIntentFilter(receiver);
都是利用packageParser中的变量,这些变量在解析完成时赋值的。
3,对IntentFilter进行匹配
if (intentFilters != null && intentFilters.size() > 0) {
for (IntentFilter intentFilter : intentFilters) {
int match = intentFilter.match(context.getContentResolver(), intent, true, "");
if (match >= 0) {
ActivityInfo flagInfo = packageParser.getReceiverInfo(new ComponentName(receiver.packageName, receiver.name), flags);
if ((flags & PackageManager.MATCH_DEFAULT_ONLY) != 0) {
if (intentFilter.hasCategory(Intent.CATEGORY_DEFAULT)) {
ResolveInfo resolveInfo = newResolveInfo(flagInfo, intentFilter);
resolveInfo.match = match;
resolveInfo.isDefault = true;
outList.add(resolveInfo);
} else {
//只是匹配默认。这里也算匹配不上。
}
} else {
ResolveInfo resolveInfo = newResolveInfo(flagInfo, intentFilter);
resolveInfo.match = match;
resolveInfo.isDefault = false;
outList.add(resolveInfo);
}
•••
8.4 ContentProvider匹配
ContentProvider的匹配过程在此就不论述了,和前面三大组件的过程完全相同。