Intent 是应用程序内不同组件之间通信的载体。当 Android 运行时需要连接不同的组件时, 通常借助于 Intent 来完成。Intent 可以启动应用中另一个 Activity,也可以启动一个 Service, 还可以发送一条广播消息来触发系统中的 Broadcast Receiver,它们之间的区别只是使用机制 不同。
Intent 封装了当前组将需要启动或者触发的的目标组件的信息。根据 Intent 是否明确指定 目标组件,Intent 可以分为显示 Intent 与隐式 Intent。前者需要明确指明需要启动或者触发的 组件类名;后者只需指定需要启动或者触发的组件应该满足的条件。
在显示 Intent 中,系统会根据 Intent 包含的信息直接确定需要启动或触发的组件;而在隐 式 Intent 中,通过 Intent 与 Intent-filter 的匹配确定目标组件。Intent 中包含有四个与隐式 Intent 有关的属性:Action、Category、Data、Type。其中 Action 代表 Intent 所要完成的一个抽象“动 作”;Category 用于为 Action 增加额外的附加类别信息;Data 通常用于向 Action 提供操作的 数据;Type 用于指定 Data 所指定 Uri 对应的 MIME 类型。其中,Action、Category 与 Type 的数据类型为 String 类型,Data 的数据类型是 Uri 或 MimeType 类型。Uri 由 scheme、host、 port、path 四部分组成。例如,在一个 Uri 数据 content://nust。test。project:8080/cz/example 中, connect 是 scheme 部分,nust。test。project 是 host 部分,8080 是 port 部分,/cz/example 是 path 部分。MimeType 是多用途互联网邮件扩展类型,用来设置文件的扩展名。例如,“audio/mp3” 表示 mp3 的多媒体文件。常见的 MimeType 类型数据有“audio/*”,“image/*”,“video/*”,“text/*” 等,分别表示多媒体、图片、影音、文本文件格式。
如图 2。1,Activity、Service、Content Provider 组件内会声明 Intent-Filter,一个组件可以 声明 0-1 个 Intent-Filter,一个 Intent-Filter 包含可以 0-N 个 Action、0-N 个 Category、0-1 个 Data。
一个 Intent 会与一个 Intent-Filter 进行匹配,从而确定要启动或触发的组件。根据上文提 到的 Intent 属性,匹配方式可以分为 Action 匹配、Category 匹配和 Data 匹配。前两种较为简 单,由于一个 Intent 对象最多只能包括一个 Action 属性,但可以包含多个 Category 属性,所 以只需 Intent 与 Intent-Filter 中的任意一个 Action 匹配,并且 Intent 中所有的 Category 都包含 在 Intent-Filter 中,即可确定需要启动或触发的组件。
对于 Data 匹配来说,可以继续分成两个部分:Uri 匹配和 MineType 匹配。Uri 匹配:如 果目标组件的<data。。。/>子元素只指定了 android:scheme 属性,那么只要与 Intent 属性的 scheme 部分匹配即可;如果目标组件的<data。。。/>子元素只指定了 android:scheme、android:host 属性, 那么只要与 Intent 属性的 scheme、host 部分匹配即可;如果目标组件的<data。。。/>子元素指定 了 android:scheme、android:host、android:port 属性,那么需要与 Intent 属性的 scheme、host、 port 部分 匹配 ; 如 果目标 组件 的<data。。。/> 子元 素指 定了 android:scheme 、 android:host、 android:path 属性,那么需要与 Intent 属性的 scheme、host、path 部分匹配;如果目标组件的论文网
<data。。。/>子元素指定了全部属性,那么需要与 Intent 所有属性匹配,确定匹配之后,即可确定 目标组件。MineType 匹配:值唯一,直接进行匹配即可。
2。2 相关工作
目前国内外针对 Android 应用程序中 Activity 活动图的研究主要可以分为静态分析与动态 分析,它们的分析都可以通过 soot 代码分析工具进行。