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

概述

在日常开发中常常用到Intent,例如在启动Activity , 启动service ,发送广播时都须要指定一个Intent, Intent 是一个将要执行动做的抽象描述,一笑消息的传递对象,负责各个组件之间的通信android

主要用途

Intent 是一个消息传递对象,您能够用来从其余应用组件请求操做。尽管 Intent 能够经过多种方式促进组件之间的通讯,但其基本用例主要包括如下三个bash

  • 启动Activity

Activity表示一个应用页面,经过Intent传递给StartActivity()来启动新的页面,Intent 用于描述要启动的 Activity,并携带任何须要的数据 。 若是但愿在Activity 完成后收到结果,请调用 startActivityForResult()。在 Activity 的 onActivityResult() 回调中,您的 Activity 将结果做为单独的 Intent 对象接收服务器

  • 启动Service

Service 是一个不使用用户界面而在后台执行操做的组件,您可使用 Service 类的方法来启动服务。经过将 Intent 传递给 startService(),您能够启动服务执行一次性操做(例如,下载文件)。Intent 用于描述要启动的服务,并携带任何须要的数据。 若是服务旨在使用客户端-服务器接口,则经过将 Intent 传递给 bindService(),您能够从其余组件绑定到此服务spa

  • 发送广播

广播是任何应用都可接收的消息,系统将针对系统事件(例如:系统启动或设备开始充电时)传递各类广播。经过将 Intent 传递给 sendBroadcast() 或 sendOrderedBroadcast(),您能够将广播传递给其余应用code

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的数据

相关文章
相关标签/搜索