Intent的查找与匹配简介

App信息表的构建

在系统启动时,PackageManagerService会启动,此时PMS将解析全部已安装的应用的信息,构建一个信息表。java

 

public class PackageManagerService extends IPackageManager.Stub {
    // 省略代码...

    // All available activities, for your resolving pleasure.
    final ActivityIntentResolver mActivities =
          new ActivityIntentResolver();

    // All available receivers, for your resolving pleasure.
    final ActivityIntentResolver mReceivers =
          new ActivityIntentResolver();

    // All available services, for your resolving pleasure.
    final ServiceIntentResolver mServices = new ServiceIntentResolver();

    // All available providers, for your resolving pleasure.
    final ProviderIntentResolver mProviders = new ProviderIntentResolver();

    // 省略代码...
}

匹配过程

当用户经过Intent来跳转某个组件时,会根据Intent中包含的信息到PMS中匹配对应的组件列表,最后跳转到目标组件中。ide

若是Intent指明了Component,那么直接经过Component就能够找到ActivityInfo列表,这个列表数量只有一个,这个ActivityInfo就是指定的那个组件;spa

若是没有指定具体的组件,那么Component为空,此时先查看Intent是否指定了要跳转到的目标所在的包名,若是有包名,则会经过包名获取到对应的ActivityInfo;code

不然就须要经过ActivityIntentResolver等类的queryIntentForPackage进行模糊匹配,例如Action、Category等。对象

匹配过程的方法调用流

Context.startActivity() it

-> Context.startActivityForResult()io

-> Instrumentation.execStartActivity()class

-> ActivityManagerService.startActivity()service

-> ActivityStackSupervisor.startActivityMayWait()方法

-> PackageManagerService.resolveIntent()

-> PackageManagerService.queryIntentActivities()

-> 获得ActivityInfo对象。

相关文章
相关标签/搜索