深入Android 【4】 —— 组件调用
深入Android 【四】 —— 组件调用原文地址:http://www.cnblogs.com/duguguiyu/archive/2010/02/07/1665544.ht
深入Android 【四】 —— 组件调用
原文地址:http://www.cnblogs.com/duguguiyu/archive/2010/02/07/1665544.html
如上图所示,要想跑通整个流程,另一个很重要的东西,就是
Intent Filters,它是用来描述一个Activity或Serveice等组件,期望能够响应怎么样的Intent。如果一个组件,只希望别的组件通过Explicit Intents(就是指明Component...)的方式来找到它,那么就不需要添加Intent Filters,反之,一定需要一个或若干个Intent Filters。Intent Filter的各个项,犹如Intent照镜子过来的效果,包括Action,Catagory,Data,Type等。Intent Filters可以写到配置文件中,和那些组件的配置一起(不记得什么是配置文件了,可以看这里...),若干的实例可以在Intent介绍页面上找到(
reference/android/content/Intent.html)。同样,Intent Filters可以在代码中,动态插拔,这个是和动态插拔的
Broadcast Receiver是配套使用的。系统核心的模块,会负责收集这些Intent Filters,和它们对应的组件信息。当请求者需要一个组件帮忙,并构造了描述它需求的Intent发送到系统核心,系统核心会将其与已知的各个Intent Filters进行匹配,挑选一个符合需求的组件返回。如果有多个符合的,会尝试看看有没有默认执行的,如果没有默认的,就会构造UI,让用户帮助抉择,如是,整个流程就跑通了。
Intent实现
上图,是请求一个Activity组件的简单实现流程图,算是用的最多的Intent解析实例。流程从调用Context.startActivity(Intent)开始,调用者传入构造好的Intent对象,然后流程会让实际的执行者,是Instrumentation对象来完成。它是整个应用激活的Activity管理者,集中负责该应用内所有Activity的起承转合生离死别。它有一个隐藏的方法execStartActivity方法,就是负责根据Intent启动Activity的。去掉一些细节,它做得最重要的事情,就是将此调用,通过RPC的方式,传递到ActivityManagerService。
前面一直再说,系统核心层,其实这里所谓的系统核心层,就是负责Android一些关键事务的一组服务。它们同样运行在虚拟机上,和普通的Service实现机理是一致的,只不过它们不抛头露脸只是默默的在下层服务,故谓之核心嘛。AcitivityManagerService,是负责Activity调度的服务,也许日后提及调度细节的时候还会有涉及。在这里,AcitivityManagerService会分两个步骤完成相关操作,首先把Intent递交给另一个服务PackageManagerService,此服务掌握整个软件包及其各组件的信息,它会将传递过来的Intent,与已知的所有Intent Filters进行匹配(如果带有Component信息,就不用比了...),找到了,就把相关Component的信息通知回AcitivityManagerService,在这里,会完成启动Activity这个很多细节的事情。由此可知,启动Activity,要经过多个服务的处理,并不是非常轻量的过程,在Android随机文档介绍性能的一节中,对此有一个评估。但这样的操作不是会放在循环里反复折磨的那种,因此整体效果与其付出的性能代价相比,觉得是物超所值的。