您的位置:首页 > 编程语言 > Go语言

Intent详解

2015-09-20 14:15 483 查看
1.定义
intent是一种运行时绑定机制, 是一种利用消息进行交互的机制。与intent有关的2个类是IntentFilter和IntentReceiver。Intent提供activity、service、BroadcastReceiver以及底层应用之间的相互触发和数据交互(运行时绑定)。intent描述了一次操作的动作、动作涉及的数据和附加数据,intent用于通知系统内核调用intent明确或模糊指定的应用。intent分成2类:(1)显式intent:显式intent直接指定需要启动的组件的名字来启动activity、service或BroadcastReceiver。即直接指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。(2)隐式intent:隐式intent无需指定目标应用的名字,只需选择性的指定Intent的Action、type以及category的属性,则具有过滤这些Intent的4大组件就能被这些Intent激活。
Android的核心Intent:连接4大组件的纽带Intent是一种利用消息进行交互的机制。Intent对象描述了应用中一次操作的动作、涉及的数据和附加数据,FrameWork通过Intent的描述调用对应的用户的应用、底层应用、service、activity或BroadcastReceiver。Intent提供了组件之间的延迟绑定机制。通过Intent调用底层应用必须设置底层应用许可。
2.发送Intent激活不同组件的方法

1)、要激活一个新的Activity,或者让一个现有的Activity做新的操作,可以通过调用Context.startActivity()或者Activity.startActivityForResult()方法。
2)、要启动一个新的Service,或者向一个已有的Service传递新的指令,调用Context.startService()方法或者调用Context.bindService()方法将调用此方法的上下文对象与Service绑定。
3)、广播Intent的发送:Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()这三个方法可以发送Broadcast Intent。发送之后,所有已注册的并且拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。 底层应用也是通过广播来接收Intent。
4.Intent的不交叠性
不同方法发送的Intent一旦发出,Android都会准确找到与Intent属性描述相匹配的一个或多个Activity,Service或者BroadcastReceiver作响应。所以,不同类型的Intent消息不会出现重叠,即Broadcast的Intent消息只会发送给BroadcastReceiver,而决不会发送给Activity或者Service。由startActivity()传递的消息也只会发给Activity,由startService()传递的Intent只会发送给Service。
5.Intent工作原理
你的程序向Android发送一个Inent请求,Android会根据Intent的内容在注册的IntentFilter中选择适当的组件来响应。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION请求给Android,Android会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,匹配该Inent的IntentFilter所在的组件将会被FrameWork自动激活。
6.Intent通过下面的属性来准确的标定某种意图
1)、component(目标组件):目标组件的类名。设置了该属性即为显式Intent
2)、Action(动作):用来表示意图的动作,如:查看,发邮件,打电话
3)、category(类别):用来表示动作的类别。
4)、type(数据类型):对data类型的描述。
5)、data(数据):表示与动作要操作的数据。如:查看 联系人
6)、extras(附件信息):附件信息。如:详细资料,一个文件,某事。
7.FrameWork对Intent解析机制-查找IntentFilter并匹配的过程
显式Intent直接用组件的名称定义目标组件,这种方式很直接,不需要解析。显式Intent多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。
隐式Intent恰恰相反,由于开发人员往往并不清楚别的应用程序的组件名称,它不会用组件名称定义需要激活的目标组件,而是通过Intent的Action、type以及category的属性定义需要激活的目标组件,具有匹配这些属性的IntentFilter的组件将被FrameWork激活。
8.隐式Intent解析机制
该机制是FrameWork通过查找已注册在AndroidManifest.xml中的所有<intent-filter>及其中定义的Intent,通过PackageManager(注:PackageManager能够得到当前设备上所安装的
application package的信息)来查找能处理这个Intent的component。在这个解析过程中,对于隐式Intent,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
1)、如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
2)、如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配;如果Intent中的数据不是content:类型的URI,而且Intent也没有明确指定type,将根据Intent中数据的scheme(比如 http:或者mailto:)进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
3)、如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
一个隐式Intent请求要能够传递给目标组件,必要全部通过Action、Data以及Category这三个方面的检查。如果任何一方面不匹配,Android都不会将该隐式Intent传递给目标组件。下面是这三方面检查的具体规则。
9.Action、Data以及Category的检查规则:
IntentFilter指定的属性必须完全包含Intent指定的属性,这样就能匹配。
1).动作测试(任意一个匹配即可)
<intent-filter>元素中可以包括子元素<action>,比如:[xhtml] view plaincopy
<intent-filter>
<action android:name="com.example.project.SHOW_CURRENT" />
<action android:name="com.example.project.SHOW_RECENT" />
<action android:name="com.example.project.SHOW_PENDING" />
</intent-filter>
一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配;如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试;如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况:
a. 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配。
b. 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。
2).类别测试(任意一个匹配即可)
<intent-filter>元素可以包含<category>子元素,比如:[xhtml] view plaincopy
<intent-filter . . . >
<category android:name="android.Intent.Category.DEFAULT" />
<category android:name="android.Intent.Category.BROWSABLE" />
</intent-filter>
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。一个没有指定任何类别测试的IntentFilter仅仅只会匹配没有设置类别的Intent请求。

3).数据测试(任意一个匹配即可)
数据在<intent-filter>中的描述如下:[xhtml] view plaincopy
<intent-filter . . . >
<data android:type="video/mpeg" android:scheme="http" . . . />
<data android:type="audio/mpeg" android:scheme="http" . . . />
</intent-filter>

<data>接受元素指定了希望的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、authority和path。其中,用setData()设定的Intent请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息