android——Intent意图机制详说(待续)

本文深入解析了Android中的Intent机制,详细介绍了Intent的组成部分及其工作流程,包括精确和模糊Intent的区别、IntentFilter的作用及如何通过组件管理服务实现组件间的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Intent机制

组件的连接模式

组成

连接模型由三部分组成 调用组件、 组件管理服务、 实现组件

流程

1. 调用组件 描述其功能需要的Intent对象,发给 组建管理服务 。

2. 组件管理服务负责将 Intent对象 与描述组件功能的 IntentFilter 对象进行比较,寻找合适的实现组件。

3. 组件管理服务 启动Intent描述的 实现组件 ,并将intent传送给他

说明

组件管理服务:是一个系统服务,运行在系统核心进程的独立线程中,通过进程间通信机制,与各个组件交互。

Intent对象的作用

  1. 载体:是组件间通信信息的载体,封装了调用组件提供的指令、数据,序列化传递给实现组件。
  2. 协议:定义了组件间的连接协议。每个intent包含若干数据项。
  3. 调用组件 根据规范构造Intent对象,描述其需要。 实现组件 根据规范解析Intent对象, 组件管理服务 依照这规范寻求匹配的组件

Intent的构成

Intent使用 7 个部分构成的: Action 、 Data、 Type、 Component 、 Extras 、 Flag

Action

定义

表示动作。

说明

当 调用组件 指明一个 action , 执行组件 会依照此动作,接受相关输入,执行操作,生成输出。

当系统预设的标准动作无法满足需要,可自定义 action

Data

定义

当请求时,**调用组件** 如有明确的数据对象,就会用 Data 存储。

说明

譬如:

邮件应用需要第三方组件展示附近中的图片信息,则在请求查看图片的Intent中的 Data 存放图片地址信息。

1
2
3
4
5
//设置
Intent.setData / Intent.setDataAndType
//读取
Intent.getData
//Data数据也是String,格式符合URI标准

Type

定义

如果 data 用于特指,那么 Type 则用于泛指。

说明

1
2
3
4
//设置
Intent.setType / Intent.setDataAndTyep
//读取
Intent.getType

Type 是MIME格式的String,用于描述组件的能够处理的请求类型或不错说明 data 类型,其可以通过 * 表示整个类别的信息,譬如 iamge/*

注意

1. Data 和 Type 经常互斥使用。当调用 setType 时,之前设定的 Data 会清空,反之一样。

2. 需要 Data 表示数据还是 Type 表示类型,经常是更加 action 。
3. 但是很多时候, Type 与 Data 又是相辅相成: Data 作为数据的载体, Type 作为 Data 的补充.

1
2
3
4
5
6
7
8
//寻找一个图片组件显示图片,需要将图片地址放入data中
Intent intent = new Intent ( Intent.ACTION_VIEW );
intent.setData ("file ://sdcard / iamge.data ");
//但是仅通过data无法知晓是指向图片的地址
//此时需要添加 image/jpg 这样的Type

//当设置完Data再设置Type,Data信息会被清空
intent.setDataAndType ( )

Catagory

定义

表示intent是有条件,必须满足条件才能运行

说明

每个intent可包含多个 Category ,彼此之间是  关系,一个组件需支持全部 Category 项才行

1
2
3
4
//添加
Intent.addCategory()
//获取
Intent.getCategory()

如果一个组件需要启动其他应用,且希望进入的是这个应用的入口组件,应添加 Intent.Category_LAUNCHER
Component

定义

目标组件的类型信息

说明

1
2
3
4
//利用类型设定
Intent.setComponent
//利用类型对象信息设定
Intent.setClass

当调用组件明确指定了Component信息,组件管理服务就不再需要跟进 Action、 Data 等信息寻找。

一旦指定了 Component ,Intent对象就变成单纯的信息载体,只负责传递信息和数据。

Extras

定义

数据传输的载体,负责将数据从调用组件传递到实现组件。

说明

1. Extras 是 Bundle 对象,按 键/值 对存储,其实现了 Parcelable 接口,可序列化和反序列化。
2. Extras 的使用关健在于键值的定义! 调用组件 和 实现组件 都需事先知晓每个键值的数据类型和含义。键值的定义与 组建管理服务 无关,可任意String。

1
2
3
4
//获取对象并读写
Intent.getExtras()
//设定指定键值数据对象
Intent.setExtras()

Flag

定义

一个整数,由一些列标准位汇集而成,是 调用组件 指定 组件管理服务 构建 实现组件 的方式,常用于改变实现组件的 任务模型 和 进程模型 。

说明

Intent对象定义了所有的*Flag*

1
2
3
4
//设置
Intent.setFlags()
//添加
Intent.addFlags()

被设定的 Flag 标志位将会重复生效,是  关系。

Intent对象的解析

在意图机制中, 组件管理服务 负责接受与分析。从 实现组件的选择上,Intent对象分为两类: Explicit Intent 和 Implicit Intent

Explicit Intent
精确描述 :指所用带 Component 的Intent,常用于内部通信,不带动态机制

Implicit Intent
模糊描述:不包括 Component 的Intent,不在乎 实现组件 是谁,应用于不同应用组件间联通,完全解耦。

IntentFilter对象

说明

1.*intentFiler*是各个组件用于描述其功能的,通过组件的 intentFilter 信息, 组件管理服务 可以了解各个组件的功能。当 组件管理服务 接收到 调用组件 发来的模糊Intent,会与所有组件的 IntentFilter进行匹配,寻找实现组件。

2.每个组件可以有 任意数目 的 intentFilter。组件包含的 intentFilter越多,其接受范围越广。

3.不含 intentFilter 的组件,只能通过精确调用

其他

IntentFilter 信息在配置文件 <intent-Filter>中添加

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<activity>
    <intent-filter android:xxxxx>
        <action android:name.../>
        <category .../>
        <data
            android:host="..."
            android:mimeType="..."
            android:path="..."
            android:pathPattern="..."/>
    </intent_filter>
</activity>

Action标签

每个 intentFilter 都必须包含 action。可以包含多个 action,表示同时支持多个动作。(  )。

对于大部分 intentFilter 对象,都会包含一个 action 。如果一个组件期望支持多个 action,建议添加多个 intentFilter

category标签

intentFilter 可以包含多个 categor ,表示该对象能够接受多个 category。他们是“  ”关系,表示该intentFilter 无论满足哪一个条件都可以接受请求。

Data和Type标签

IntentFilter也可以包含可接受数据的范围 和 类型相关的数据类。

Intent匹配的算法流程

有很多图,下次在配啦~~

匹配组件的选择

如果有多个 intentFilter 对象与 intent,则需要在所在的对象中进行筛选。其最核心是 基于优先级 机制。

每个IntentFilter都有一个优先级(-1000~1000)。

IntentFilter.SYSTEM_LOW_PRIORITY

IntentFilter.SYSTEM_HIGH_PRIORITY

默认优先级是0,android:priority

在进行Intent匹配时返回的 32位整数,只作为错误码使用,与优先级无关。

Intent匹配的优化

通过引入 组件管理服务 ,降低了耦合但也增加了连接成本。优化的主要方法是 索引 、**缓存** 。

意图机制的使用

1.在界面组件activity中的应用

- 通过startActivity() 或者 startActivityForResult 调用。
- 调用组件可在 Intent 中添加一些 Flags:
Intent.FLAG_ACTIVITY_NEW_TASK

Inteng.FLAG_ACTIVITY_NO_FLAG

3.如果 组件管理服务 发现多个界面组件满足,则会 效率与公平 地选出。

- 效率:通过算法进行筛选,满足一下条件会直接选择A

1
2
//A的优先级高于B
//A包含Intent.CATEGORY_DEFAULT,而B没有。
  • 公平:当无法通过效率方法选出时,则让用户选出。
1
2
3
4
5
//如想调用组件绕过默认值的约束,让用户根据情景再次选择,可以
activity.startActivity( Intent.crateChoose( intent,R.xxx.xx ));

//自定义组件选择界面样式,可以通过获得与Intent对象匹配的所有备用组件列表
List<ResolveInfo> l = getPackageManager() .queryIntentActivities( intent, PackageManager.MATCH_DEFAULT_ONLY );

2.在服务组件的应用

由于 服务组件 是在后台提供的,当出现多个匹配项时,Android默认优先级最高的组件。只要备用组件没有变化,对于同一个intent来说,其实现是固定的。 组件管理服务 会记录其对应的组件。

3.在触发器组件中的应用

触发器功能是监听广播事件的Intent对象,并对其进行解析和处理。事件信息的载体就是 itnent本身。在触发器组件的构造中,不存在匹配组件这样的问题。

总结

intent机制 被广泛应用于 界面组件的调用 、**服务组件的调用和绑定** 以及 触发器组件的调用 。

声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息

原文作者: guanMac

原文地址: http://my.eoe.cn/guanmac/archive/5822.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值