Android Intent 机制 - Runtime Bind

作者: Goo_Yao | 来源:发表于2017-01-10 14:25 被阅读72次

前言

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-filter>**来筛选);这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。

Intent 解析机制

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

解析机制

  1. 通过查找已注册在AndroidManifest.xml的所有<intent-filter>及其中定义的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 Bind

    前言 Intent 相信大家都对它不陌生,startActiviy、startService、bindServic...

  • Android Intent

    >>Intent介绍: Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用...

  • Android Intent的简介

    一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用...

  • 【Android开发高级系列】应用间跳转专题

    1 Intent简介 Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一...

  • android中Intent与Intentfilter

    一、Intent 1、什么是Intent? 在Android中Intent机制是用来协助应用间的交互与通讯,Int...

  • Android-Intent

    Intent简介 Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作...

  • 你必须弄懂的Intent Filter匹配规则

    Intent简介Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的...

  • 事件总线初探

    闲话说说Android的通信机制,Android的通信方式有蛮多,intent、broadcast、进程间通信等等...

  • Intent、IntentFilter的匹配规则

    1、Intent的概念: Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,...

  • Android之Intent的使用

    一、介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯...

网友评论

    本文标题:Android Intent 机制 - Runtime Bind

    本文链接:https://www.haomeiwen.com/subject/owbkbttx.html