Android Intent 机制 - Runtime Binding

前言

Intent 相信大家都对它不陌生,startActiviy、startService、bindService、sendBroadcast...等常用方法都需要Intent来协助完成,那么,问题来了:“Intent 是什么?其作用是什么?其中有着怎样的机制呢?”

Intent 概述

Intent是一种运行时绑定(run-time binding)机制,它是一种基于某种想要被表露的意图的被动式数据结构,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。

四大基本组件中,Activity、Service、BroadcastReceiver 都需要通过Intent机制来激活,不同的组件需要不同的Intent传递方式

Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity,Service或者BroadcastReceiver作响应。所以,不同类型的 Intent 消息不会出现重叠,即Broadcast的Intent消息只会发送给BroadcastReceiver,而决不会发送给Activity或者Service。由startActivity()传递的消息也只会发给Activity,由startService()传递的Intent只会发送给Service。

Intent 结构

  • action -- 想要实施的动作,例: ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, etc.
  • data -- 具体的数据,一般由以Uri表示,例:通讯录中的某条记录,会以Uri来表示
  • category -- 为实施的动作添加的额外信息,即Intent组件的种类信息,一个Intent对象可以有任意个category,例:CATEGORY_LAUNCHER 意味着,它应该在启动器中作为顶级应用而存在
  • type -- 显示指定Intent的数据类型(MIME类型 - 多用途互联网邮件扩展,Multipurpose Internet Mail Extensions),例:一个组件是可以显示图片数据的而不能播放声音文件。很多情况下,data类型可在URI中找到,比如content:开头的URI,表明数据由设备上的content provider提供。但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导
    MIME类型有两种:单个记录格式、多个记录格式
  • component -- 指定Intent的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的,例如:Intent it = new Intent(Activity.Main.this, Activity2.class); startActivity(it);
  • extras -- 附加信息,例如:it.putExtras(bundle) - 使用Bundle来传递数据;

显式与隐式 Intent

-** 显式Intent:通过指定具体的组件类,通知应用启动对应的组件。例如:指定了component属性的、对Intent调用setComponent(ComponentName)或者setClass(Context, Class)的。
-
隐式Intent:****没有指定具体comonent属性的Intent,设置了Action、Data、Category,让系统来筛选出合适的组件来进行调用(通过**来筛选);这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。

Intent 解析机制

对于显式Intent,目标组件很明确,故Android不需要解析,Android需要解析的是间接Intent,解析后,Intent即可映射给处理此Intent的Activity、Service或BroadcastReceiver。

解析机制

  1. 通过查找已注册在AndroidManifest.xml的所有及其中定义的intent
  2. 通过PackageManager来查找能够处理这个Intent的component,因为PackageManager能够获取设备上当前所安装的application package信息,解析过程主要是通过intent中的action、type、category三个属性来判断。
    匹配规则:
  3. 如果指定action,则目标组件的IntentFilter需要含有这个action
  4. 如果Intent没有提供type,系统将从data中得到数据类型,类似action的匹配规则,目标组件必须包含Intent的数据类型,否则不匹配
  5. 如果Intent中的数据不是content类型的Uri,而且Intent也没有明确指定type,将根据Intent中数据的scheme(如 http:或者mailto:)进行匹配,同上,Intent的scheme必须出现在目标组件的scheme列表中
  6. 如果Intent指定了一个或者多个category,那么目标组件的类别列表需要包含全部所指定的类别。(如:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY)

资料来源

Intent - Android Developers
Android - Intent机制详解

你可能感兴趣的:(Android Intent 机制 - Runtime Binding)