前言

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三个属性来判断。
匹配规则:
1. 如果指定action,则目标组件的IntentFilter需要含有这个action
2. 如果Intent没有提供type,系统将从data中得到数据类型,类似action的匹配规则,目标组件必须包含Intent的数据类型,否则不匹配
3. 如果Intent中的数据不是content类型的Uri,而且Intent也没有明确指定type,将根据Intent中数据的scheme(如 http:或者mailto:)进行匹配,同上,Intent的scheme必须出现在目标组件的scheme列表中
4. 如果Intent指定了一个或者多个category,那么目标组件的类别列表需要包含全部所指定的类别。(如:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY)

资料来源

Intent - Android Developers
Android - Intent机制详解

Android Intent 机制解析 - Intent 是什么?作用是什么?相关推荐

  1. Bundle与Intent机制,Intent显式/隐式意图,传递参数及参数序列化,各种跳转(如打开浏览器),Intent的Size

    intent传递有没有大小限制,是多少?- http://blog.csdn.net/wingichoy/article/details/50679322 Android Intent调用 Uri的使 ...

  2. 【Android】Intent介绍及Intent在Activity中的使用方法

    本篇博文主要介绍Intent的相关概念,以及Intent在Activity中的使用方法. 1.Intent的实现过程 在Android中,Intent不仅可用于应用程序之间的交互,也可用于应用程序内部 ...

  3. Intent介绍及Intent在Activity中的使用方法

    1.Intent的实现过程 在Android中,Intent不仅可用于应用程序之间的交互,也可用于应用程序内部的Activity/Service之间的交互. Intent负责对应用中一次操作进行描述, ...

  4. 理解Android安全机制

    本文从Android系统架构着手,分析Android的安全机制以SE Android,最后给出一些Android安全现状和常见的安全解决方案. 1.Android系统架构 Android采用分层的系统 ...

  5. 理解Android Binder机制(3/3):Java层

    本文是Android Binder机制解析的第三篇,也是最后一篇文章.本文会讲解Binder Framework Java部分的逻辑. Binder机制分析的前面两篇文章,请移步这里: 理解Andro ...

  6. Android Activity和Intent机制学习笔记

    转自:http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html Activity Android中,Activity是所有程序的根本, ...

  7. Android开发精要3--Android中的Intent机制

    1.概述 一个应用程序的三个核心组件--activities.services.broadcastreceivers,都是通过叫做intents的消息激活.Intent消息是一种同一或不同应用程序中的 ...

  8. Android Intent机制详解

    什么是Intent  Intent 是一个将要执行的动作的抽象描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯.比如说调用startActivity()来启动一 ...

  9. [转]Android Activity和Intent机制学习笔记

    Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(见http://www.cnblogs.com/f ...

  10. 【ZT】Android Activity和Intent机制学习

    Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(见http://www.cnblogs.com/f ...

最新文章

  1. 【转】让Chrome化身成为摸鱼神器,利用Chorme运行布卡漫画以及其他安卓APK应用教程...
  2. 线性回归——最小二乘法_实例(二)
  3. 用Eclipse开发JavaWeb项目:错误信息 javax.servlet.http.HttpServlet was not found on the Java Build Path...
  4. System.Timers.Timer与System.Windows.Forms.Timer 区别
  5. 3520a SDL_tff库做bmp 也就是osd
  6. idea:忽略大小写提示设置
  7. P3128 [USACO15DEC]Max Flow P
  8. 7、Flutter banner_view 轮播图的使用
  9. ie和谷歌在java中空格兼容,谷歌和IE浏览器的兼容性问题,相同的html结构竟然在两个浏览器不一样...
  10. ZOJ3953 Intervals
  11. 你想要的宏基因组-微生物组知识全在这(2020.8)
  12. 2022-2028年中国差旅管理行业市场全景调查及投资潜力研究报告
  13. Cuda11.6 下载与安装[排坑版]
  14. 5v继电器模块实物接线_一秒看懂基础继电器电路图解
  15. 规划求解 python_使用Python/PuLp解决线性规划问题
  16. 爬虫网易财经上市公司财务数据
  17. html图片自动切换代码,急哦~!如何实现网页中的图片自动变换?
  18. 五月天 《倔强》 - 歌词
  19. ansible剧本批量安装nginx
  20. app获取通讯录全新开发

热门文章

  1. 附近的人实现原理详细剖析!
  2. mysql 提高查询速度_6条策略提高mysql查询速度
  3. 世界最早投入运行的计算机网络是,世界上最早投入运行的计算机网络是。
  4. 安规电容可靠性试验项目、试验方法及要求
  5. HDU--2015-TO-2019--假期实在是太无聊了....
  6. win10显示计算机控制面板,win10控制面板,教您win10如何打开控制面板
  7. Drillbeach---第二章 Drillbench 5.1 Dynaflodrill 用户指南
  8. git status 命令详解
  9. linux+qq+输入法下载官网,续:Linux下安装输入法和QQ软件
  10. BZOJ.3097 Hash Killer 1(卡掉自然溢出法)