概述
在平常开发中经常用到Intent,例如在启动Activity , 启动service ,发送广播时都需要指定一个Intent, Intent 是一个将要执行动作的抽象描述,一笑消息的传递对象,负责各个组件之间的通讯
主要用途
Intent 是一个消息传递对象,您可以用来从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个
- 启动Activity
Activity表示一个应用页面,通过Intent传递给StartActivity()来启动新的页面,Intent 用于描述要启动的 Activity,并携带任何必要的数据 。 如果希望在Activity 完成后收到结果,请调用 startActivityForResult()。在 Activity 的 onActivityResult() 回调中,您的 Activity 将结果作为单独的 Intent 对象接收
- 启动Service
Service 是一个不使用用户界面而在后台执行操作的组件,您可以使用 Service 类的方法来启动服务。通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 用于描述要启动的服务,并携带任何必要的数据。 如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给 bindService(),您可以从其他组件绑定到此服务
- 发送广播
广播是任何应用均可接收的消息,系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast() 或 sendOrderedBroadcast(),您可以将广播传递给其他应用
Intent的结构
Intent 对象主要包含七大属性,Action(动作)、Data(数据)、Category(类别)、Type(数据类型)、Component(组件)、Extra(扩展信息)、Flag(标志位)。其中最常用的是Action和Data
- Action
Action主要表示意图的行为,,指定该Intent要执行的动作类型 常见的action有: Activity Actions:
| 类型 | 作用 |
|---|---|
| ACTION_MAIN | 表示程序入口 |
| ACTION_VIEW | 自动以最合适的方式显示Data |
| ACTION_CALL | 拨打Data指向的号码 |
| ACTION_SEND | 发送Data到指定的地方 |
| ACTION_SEARCH | 执行搜索 |
Broadcast Actions:
| 类型 | 作用 |
|---|---|
| ACTION_TIME_TICK | 当前时间改变,并即时发送时间,只能通过系统发送。调用格式"android.intent.action.TIME_TICK" |
| ACTION_TIME_CHENGED | 设置时间。调用格式"android.intent.action.TIME_SET" |
- Data:各个组件之间要传递的数据
例如查看通讯录的个人信息就是以Uri的形式传递数据
- Category:用来表现动作的类别
一个包含Intent额外信息的字符串,表示哪种类型的组件来处理这个Intent
- Type:指定数据类型
一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导
- Component:目的组件
指定Intent的目标组件名称,当指定了这个属性后,系统将跳过匹配其他属性,而直接匹配这个属性来启动对应的组件
- Extra:扩展信息
Intent可以携带的额外 key-value 数据,你可以通过调用putExtra()方法设置数据,每一个 key对应一个 value数据。你也可以通过创建 Bundle对象来存储所有数据,然后通过调用putExtras()方法来设置数据
- Flag: 期望这个意图的运行模式
用来指示系统如何启动一个Activity,可以通过setFlags()或者addFlags()可以把标签flag用在Intent中
Intent的类型
- 显示Intent:指定具体的组件名称,通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,您可能会启动您应用内的新 Activity 以响应用户操作,或者启动服务以在后台下载文件
Intent intent = new Intent(getApplicationContext(), MvpActivity.class);
startActivity(intent);
- 隐式Intent: 不指定具体的组件名称,而是声明要执行的常规操作,从而允许其他应用中的组件来处理
Uri uri = Uri.parse("https://www.baidu.com");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
使用隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。如果 Intent 与 Intent 过滤器匹配,则系统将启动该组件,并向其传递 Intent 对象。如果多个 Intent 过滤器兼容,则系统会显示一个对话框,支持用户选取要使用的应用。
Intent 过滤器是应用清单文件中的一个表达式,用于指定该组件要接收的 Intent 类型。例如,通过为 Activity 声明 Intent 过滤器,您可以使其他应用能够直接使用某一特定类型的 Intent 启动 Activity。同样,如果您没有为 Activity 声明任何 Intent 过滤器,则 Activity 只能通过显式 Intent 启动
Intent数据传递大小的限制
StartActivity时候最终调用了ActivityManger.getService().startActivity的方法,并涉及到了进程间通讯,️而所映射的Binder内存大小是不到1M的,准确说是 (1024*1024) - (4096 *2) :这个限制定义在,所以最大的传输数据是不超过1M的数据