Activity之Intent(笔记)

Intent 中文译为意图

其设计的理念在于鼓励减少组件间的耦合,Intent提供了一种通用的消息系统,它允许你的应用程序与其他应用程序通过Intent来传递工作和事件,

使用Intent可以激活Android三大组件:活动,服务和广播接收者

Intent可分为显式意图和隐式意图

显式意图:调用Intent.setComponent()Intent.setClassName()Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了要激活的组件是哪个组件。

隐式意图:没有明确指定组件名的Intent为隐式意图。Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

Intent属性包括以下几点:

1.Action 动作

SDK中定义了一些标准动作如:

onstant Target component Action
ACTION_CALL activity Initiate a phone call.
ACTION_EDIT activity Display data for the user to edit.
ACTION_MAIN activity Start up as the initial activity of a task, with no data input and no returned output.
ACTION_SYNC activity Synchronize data on a server with data on the mobile device.
ACTION_BATTERY_LOW broadcast receiver A warning that the battery is low.
ACTION_HEADSET_PLUG broadcast receiver A headset has been plugged into the device, or unplugged from it.
ACTION_SCREEN_ON broadcast receiver The screen has been turned on.
ACTION_TIMEZONE_CHANGED broadcast receiver The setting for the time zone has changed.

用户也可以自定义动作

2.Data 执行动作要操作的数据

Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。对于不同的动作,其URI数据的类型是不同的(可以设置type属性指定特定类型数据),如ACTION_EDIT指定Data为文件URI,打电话为tel:URI,访问网络为http:URI,而由content provider提供的数据则为content: URIs。

3.type 数据类型 显式指定Intent的数据类型(MIME)

一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。

4.category 类别 被执行动作的附加信息

5.Component 组件  指定Intent组件的名称

6.extras 附加信息 是其他所有附加信息的组合

例如:

<intent-filter>

<action android:name="android.intent.action.CALL" />

<category android:name="android.intent.category.DEFAULT" />

<data android:scheme="tel" />

</intent-filter>

<intent-filter>

<action android:name="android.intent.action.CALL" />

<category android:name="android.intent.category.DEFAULT" />

<data android:mimeType="vnd.android.cursor.item/phone" />

</intent-filter>

Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:

  • 如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
  • 如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
  • 如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto:) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
  • 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

动作测试( Action test
 一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:
如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。
另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试

类别测试( Category test
对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。
原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。但有一个例外, Android 把所有传给 startActivity () 的隐式意图当作他们包含至少一个类别: " android.intent.category.DEFAULT " CATEGORY_DEFAULT 常量)。 因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含 " android.intent.category.DEFAULT " 。(带 " android.intent.action.MAIN " " android.intent.category.LAUNCHER " 设置的过滤器是例外)

数据测试( Data test
当一个意图对象中的 URI 被用来和一个过滤器中的 URI 比较时,比较的是 URI 的各个组成部分。例如,如果过滤器仅指定了一个 scheme ,所有该 scheme URIs 都能够和这个过滤器相匹配;如果过滤器指定了一个 scheme 、主机名但没有路经部分,所有具有相同 scheme 和主机名的 URIs 都可以和这个过滤器相匹配,而不管它们的路经;如果过滤器指定了一个 scheme 、主机名和路经,只有具有相同 scheme 、主机名和路经的 URIs 才可以和这个过滤器相匹配。当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。
数据测试同时比较意图对象和过滤器中指定的 URI 和数据类型。规则如下:
a. 一个既不包含 URI 也不包含数据类型的意图对象仅在过滤器也同样没有指定任何 URIs 和数据类型的情况下才能通过测试。
b. 一个包含 URI 但没有数据类型的意图对象仅在它的 URI 和一个同样没有指定数据类型的过滤器里的 URI 匹配时才能通过测试。这通常发生在类似于 mailto: tel :这样的 URIs 上:它们并不引用实际数据。
c. 一个包含数据类型但不包含 URI 的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个 URI 的情况下才能通过测试。
d. 一个同时包含 URI 和数据类型(或者可从 URI 推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。如果它的 URI 和这个过滤器中的一个 URI 相匹配或者它有一个内容 content: 或者文件 file: URI 而且这个过滤器没有指定一个 URI ,那么它也能通过测试。换句话说,一个组件被假定为支持 content: file: 数据如果它的过滤器仅列举了一个数据类型。


IntentFilter

描述的是一个组件愿意接受什么样的Intent对象

系统匹配IntentFilter的过程







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值