Android基础知识 — Intent的理解与使用

3,002 阅读4分钟

概述

在平常开发中经常用到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的数据