现在的位置: 首页 > 综合 > 正文

显式与隐式Intent及AndroidManifest.xml文件中intent-filter参数说明

2018年02月10日 ⁄ 综合 ⁄ 共 2528字 ⁄ 字号 评论关闭

1、显式Intent通常用于程序内部间的组件通信,已经明确的定义了目标组件的信息,所以不需要系统决策用哪个目标组件.

Intent明确的指定了要启动的Acitivity,如下:

Intent intent = new Intent(Context packageContext, Class<?> clas);

startActivity(intent);

2、隐式Intent不指明目标组件的class,只定义希望的Action、Category和Data,由系统决定使用哪个目标组件。这也是Android系统的一大亮点。

Intent没有明确的指定要启动哪个Activity ,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。

intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data。

先举个例子,在Java代码里隐式跳转到别的Activity:

Intent intent = new Intent("myActionName");
intent.addCategory("myCategoryFilter1");
intent.addCategory("myCategoryFilter2");
startActivity(intent);

这样并没有明确指明要跳转到哪个Activity,而此时,程序就会在AndroidManifest.xml文件中查找满足过滤条件的activity声明,一旦某一个Activity满足了上面的action和category,就跳转到该activity。如果有多个activity都满足条件,那么将会出现一个选择对话框,让用户选择跳转到哪个activity。

例如在AndroidManifest.xml中有如下两个Activity满足匹配条件:

<activity  android:name="ThirdActivity" android:label="activity3">
      <intent-filter>
          <action android:name="myActionName" />
          <category android:name="android.intent.category.DEFAULT" /> 
          <category android:name="myCategoryFilter1" />
          <category android:name="myCategoryFilter2" />
     </intent-filter>

</activity>
<activity  android:name="FourthActivity" android:label="activity4">
     <intent-filter>
          <action android:name="myActionName" />
          <category android:name="android.intent.category.DEFAULT" /> 
          <category android:name="myCategoryFilter1" />
          <category android:name="myCategoryFilter2" />
    </intent-filter>

</activity>

出现的选择对话框如图:

对于action:

一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作测试。如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。
(1) 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配;
(2) 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。

对于category:

intent对象中的每个种类必须匹配过滤器中的一个。即过滤器能够列出额外的种类,但是intent对象中的种类都必须能够在过滤器中找到,只有一个种类在过滤器列表中没有,就算种类检测失败!

原则上如果一个intent对象中没有种类(即种类字段为空)应该总是通过种类测试,而不管过滤器中有什么种类。但是,Android中所有隐式intent至少都默认包含android.intent.category.DEFAULT。因此,活动想要接收隐式intent必须要在intent过滤器中包含"android.intent.category.DEFAULT"。

注意:"android.intent.action.MAIN" 和 "android.intent.category.LAUNCHER"设置,它们分别标记活动开始新的任务和带到启动列表界面。它们可以包含"android.intent.category.DEFAULT"到种类列表,也可以不包含。

对于data:

<data>元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。

intent-filter所有参数的目的:是过滤意图intent,使系统能够根据这些条件找到匹配的activity,并启动最合适的activity

抱歉!评论已关闭.