文档章节

Intent的查找与匹配简介

Gnepux
 Gnepux
发布于 2017/01/11 03:24
字数 307
阅读 12
收藏 0

App信息表的构建

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

 

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中匹配对应的组件列表,最后跳转到目标组件中。

如果Intent指明了Component,那么直接通过Component就可以找到ActivityInfo列表,这个列表数量只有一个,这个ActivityInfo就是指定的那个组件;

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

否则就需要通过ActivityIntentResolver等类的queryIntentForPackage进行模糊匹配,例如Action、Category等。

匹配过程的方法调用流

Context.startActivity() 

-> Context.startActivityForResult()

-> Instrumentation.execStartActivity()

-> ActivityManagerService.startActivity()

-> ActivityStackSupervisor.startActivityMayWait()

-> PackageManagerService.resolveIntent()

-> PackageManagerService.queryIntentActivities()

-> 得到ActivityInfo对象。

© 著作权归作者所有

Gnepux
粉丝 3
博文 96
码字总数 77557
作品 0
南京
私信 提问
Intent匹配规则以及解析框架深入分析

关于Intent以及IntentFilter的基本知识,大家可以参阅如下资料, SDK中对Intent与IntentFilter的介绍 ---- 英文 其中文翻译如下: Android开发之旅: Intents和Intent Filters(理论部分) 我...

娶到笨笨
2014/04/09
0
0
[Android] Intent解析机制

Intent的解析: 在应用中,我们可以以两种形式来使用Intent: 1.1 显式Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定...

枫兮兮
2014/02/27
0
0
一个app,多个入口图标,activity-alias实现多程序入口并显示指定view完成

需求总是一个接一个。 missed call需要一个单独的图标,点击进入,而missed call 本身在linhone activity中。 思路,使用activity alias。 当然,需要intent启动activity,也就需要filter 在...

eric_zhang
2012/03/01
0
6
Android Intent 深入理解

什么是Intent Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内...

learn_more
2015/02/04
0
0
android Intent机制详解

什么是Intent Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内...

长平狐
2012/09/03
60.1K
2

没有更多内容

加载失败,请刷新页面

加载更多

策略模式

策略模式封装的是算法,而状态模式侧重的对象状态的转变。 /** * 策略,定义计算报价算法的接口 */public interface Strategy { /** * 计算应报的价格 * @param goo...

铁骨铮铮
33分钟前
0
0
如何用JavaScript写一个区块链?

Part1实现一个基本的区块链 1.区块链 区块链是由一个个任何人都可以访问的区块构成的公共数据库。这好像没什么特别的,不过它们有一个有趣的属性:它们是不可变的。一旦一个区块被添加到区块...

骚年锦时
37分钟前
0
0
HTTP协议

HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议...

惊尘大人
39分钟前
0
0
Feign输出Info级别日志

背景   spring cloud netfix组件中,feign相关的日志默认是不会输出的,需要自定义配置才能输出,并且Feign只对Debug基本的日志做出响应, 实际业务需要输出Info级别的日志,所以需要做自定...

xiaomin0322
44分钟前
3
0
面向解决问题的java编程,spring boot,mybatis generator和坑-1starter

1、start一个spring boot项目 第一课我们也不能免俗,要从starter开始,spring boot的起始项目脚手架可以从spring boot官方starter生成地址开始:https://start.spring.io/ 这张图列出了一个...

wphmoon
45分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部