Intent详解

    1.定义html

    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

    Android的核心Intent:链接4大组件的纽带Intent是一种利用消息进行交互的机制。Intent对象描述了应用中一次操做的动做、涉及的数据和附加数据,FrameWork经过Intent的描述调用对应的用户的应用、底层应用、service、activity或BroadcastReceiver。Intent提供了组件之间的延迟绑定机制。经过Intent调用底层应用必须设置底层应用许可。浏览器

    2.发送Intent激活不一样组件的方法
app

    1)、要激活一个新的Activity,或者让一个现有的Activity作新的操做,能够经过调用Context.startActivity()或者Activity.startActivityForResult()方法。 ide

    2)、要启动一个新的Service,或者向一个已有的Service传递新的指令,调用Context.startService()方法或者调用Context.bindService()方法将调用此方法的上下文对象与Service绑定。测试

    3)、广播Intent的发送:Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()这三个方法能够发送Broadcast Intent。发送以后,全部已注册的而且拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。 底层应用也是经过广播来接收Intent。spa

    4.Intent的不交叠性component

    不一样方法发送的Intent一旦发出,Android都会准确找到与Intent属性描述相匹配的一个或多个Activity,Service或者BroadcastReceiver做响应。因此,不一样类型的Intent消息不会出现重叠,即Broadcast的Intent消息只会发送给BroadcastReceiver,而决不会发送给Activity或者Service。由startActivity()传递的消息也只会发给Activity,由startService()传递的Intent只会发送给Service。xml

    5.Intent工做原理htm

    你的程序向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,它们也须要相匹配才会经过测试。

相关文章
相关标签/搜索