作为安卓开发者,最好的最原始的资料还是来自谷歌,所以谷歌官网会是我以后首要的光顾地点。没事点点这里,看看那里总会有收获。但是泛泛的浏览,会成为过眼烟云,所以我选择在CSDN博客做笔记。
Intent
Intent有两种类型---显式Intent和 隐式Intent。
显式Intent
显式Intent经常作用于本应用中。显式Intent需要制定要启动的界面或者服务的完整类名。由于我们都知道自己应用中Activity和Service的类名,所以在本应用中我们会使用显示Intent制定要启动的Android 应用组件。
隐式Intent
隐式Intent常常用于启动其他应用的Activity。应用A的aActiivty通过在清单文件AndroidManifest文件中设置Intent-Fileter来规定其他应用如何通过隐式Intent来启动它。如果B应用的bActivity想要打开A应用的aActivity就要满足Intent-Filter。
如果Android系统找到匹配的组件供隐式Intent打开,就会打开该组件,如果有多个满足条件会出现应用应用选择列表来让我们选取某个应用处理。如果只有一个应用的组件满足条件,就打开这个。
如果组件响应此Intent,就会报错。所以我们在隐式调用其他组件的时候需要加上判断intent.resolveActivity来判断此组件是否存在。
IntentFilter
要指定应用中的某个组件能够接收到隐式Intent,需要在清单文件中为该组件配置Intent-filter节点,以指明该组件接收隐式意图的action,category和data等。在清单文件中配置Intent-Filter节点需要以下节点指定要接受的隐式Intent.
1,<action>标签,该标签指明Intent的操作。
2,<data>标签 申明接收的数据类型
3,<category> 标签 如果要接收隐式Intent,CATEGORY-DEFAULT必须包含在该节点中。
隐式Intent的解析
1,操作的解析
如果intent的action与清单文件的action某一项匹配,则通过匹配
如果没有action元素,则不能与任何得Intent进行匹配
如果action指定至少一个操作,intent中没有指定操作,则匹配
2,类别的解析
只有category中所有的name与intent匹配,则通过
3,数据的解析
- 仅当过滤器未指定任何 URI 或 MIME 类型时,不含 URI 和 MIME 类型的 Intent 才会通过测试。
- 对于包含 URI、但不含 MIME 类型(既未显式声明,也无法通过 URI 推断得出)的 Intent,仅当其 URI 与过滤器的 URI 格式匹配、且过滤器同样未指定 MIME 类型时,才会通过测试。
- 仅当过滤器列出相同的 MIME 类型且未指定 URI 格式时,包含 MIME 类型、但不含 URI 的 Intent 才会通过测试。
- 仅当 MIME 类型与过滤器中列出的类型匹配时,包含 URI 和 MIME 类型(通过显式声明,或可以通过 URI 推断得出)的 Intent 才会通过测试的 MIME 类型部分。如果 Intent 的 URI 与过滤器中的 URI 匹配,或者如果 Intent 具有
content:
或 file:
URI 且过滤器未指定 URI,则 Intent 会通过测试的 URI 部分。换而言之,如果过滤器仅列出 MIME 类型,则假定组件支持 content:
和 file:
数据
构建一个Intent
构建一个Intent需要设置以下类容。
1,组件名称。当需要显式的开启一个Actiivty或者代开一个Service需要指定组件名称。如果启动的是本应用的组件可以省略掉包名.
2,操作 指定该Intent的操作。如拨打电话,将信息发送到指定联系人。
3,在指定了操作类型以后,我们有的时候还需要指定这些操作的数据,比如我们使用Intent.action.ACTION_DAIL的时候需要指定号码。有的时候我们还需要指定数据的MIME类型。我们可以通过setData和setType方法来设置数据和类型或者调用setDataAndType方法设置数据和类型。如果同时需要设置数据和类型,不能同时调用setData和setType,因为他们会相互抵消,这个时候我们就需要使用setDataAndType方法。
4,类别 这个用来设置启动类型。如每个应用的Mainactivity默认的启动类型是CaTEGORY_LUNCHER.
5,参数 通过setExtra方法设置键值对。
6,标记 设置标记告诉Android系统启动的Activity属于那个任务以及它是否属于某个Activity列表 。