上次博客中,介绍了Intent的启动Actiity的过程,这次来开始研究Intent过滤器。

开始Intent过滤器之前,首先可以看下过滤器的三个标签,具体参看下表。

标签

属性

说明

android:name

指定组件所能响应的动作,用字符串表示,通常由Java类名和包的完全限定名构成

android:name

指定以何种方式去服务Intent请求的动作

 

 

android:host

指定一个有效的主机名

android:mimetype

指定组件能处理的数据类型

android:path

有效的URI路径名

android:port

主机的有效端口号

android:scheme

所需要的特定协议

Category可以由系统提供也可以自定义,这里附上一张系统提供的Category标签表:

说明

ALTERNATIVE

Intent数据默认动作的一个可替换的执行方法

SELECTED_ALTERNATIVE

和ALTERNATIVE类似,但替换的执行方法不是指定的,而是被解析出来的

BROWSABLE

声明Activity可以由浏览器启动

DEFAULT

为Intent过滤器中定义的数据提供默认动作

HOME

设备启动后显示的第一个Activity

LAUNCHER

决定程序是否显示下程序列表中(一般为桌面)

接下来将分别介绍几个常用Category的用途,首先是HOME,HOME的第一个作用是设备开机时会给我们提供选择进入哪个页面,系统会列出所有的可供选择的Activity;HOME的另一个作用是在应用中当我们点击home键之后,同样的会弹出一个选择页面,结果如下图两张图,左边是开机时的,右边是点击home键图。

              

DEFAULT:如果一个Activity需要隐式启动,那么必须给它加上一个DEFAULT标签,但是不仅仅只限于一个DEFAULT,还可以添加其他的Category。


LAUNCHER和MAIN:

android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里。android.intent.action.MAIN决定应用程序中最先启动的Activity。

 

下面我们来测试几种情形:

第一种,有MAIN无LAUNCHER:

结果:直接运行app提示无默认Activity,运行单独的Activity可以运行,但是着桌面没有图标。


第二种,有LAUNCHER无MAIN:

结果:同第一种情况一样

 

第三种,有多个Activity同时有MAIN和LANUCHER

AndroidMainfest.xml代码示例:

                                                                                                

 结果:桌面有两个程序的图标。


测试时需要注意,在两个Activity中要分别设置label(应用程序的名称),否则只会生成一个图标。另外,在两个Activity都没有添加DEFAULT或者都添加了DEFAULT的前提下,两个Activity在AndroidMainfest.xm中先后顺序决定了程序首先启动的是哪一个Activity。

 

现在再来解释下DEFAULT对启动顺序的影响,如果两个Activity中有一个添加了一个DEFAULT(前提是两个Activity都添加了MAIN和LAUNCHER),那么无论哪个Activity在前,都会先执行添加了DEFAULT的那个Activity,假如两者都添加DEFAULT,那么哪个首先执行取决于顺序。不信的朋友可以自己试试。

 

Android系统的Intent的解析规则如下:

1. 一个意图Intent至多只会包含一个action和多个category,而一个intent filter 却可以包含多个action和多个category。在intent与Intentfilter匹配时,要求在intent中出现的action和所有category必须全部包含在intent filter中。

 

2. Intent的数据data中Uri的每个子部需要与Intent filter标签中的属性进行匹配,如果标签指定了协议,主机名,路径,端口等,则需要完全匹配,任何不匹配的intent都将会被过滤掉。

 

3. 如果intent filter匹配的结果多于一个,则用户来进行选择。

 

4. 在 Intent中,最多指定一个“action”,而在intent filter中则可以指定多个action,只要intent filter中的action包含intent中的action,该intent就可以通过,未指定action的intent可以满足intent filter指定的任意的action。

5. 一个activity可以包含多个intent-filter,对于包含多个intent-filter的activity,只要其中一个intent-filter被intent匹配则这个activity就可以被启动。

 

解析规则这么多,总的来说就一句话,intent通过代码设置的条件,无论是action还是category,只要是intent-filter的子集,那么就可以匹配,如果有data的话,需要intent通过代码设置的data和intent-filter中data的内容完全一致(协议,主机名,路径,端口等)才可以匹配。

更多相关文章

  1. Evernote Android(安卓)最新版加入手寫記事與圖說註解功能
  2. 【入门篇】Android学习笔记――常用布局
  3. 想抢先体验Android操作系统的魅力吗?那就使用Android(安卓)LiveCD
  4. 想抢先体验Android操作系统的魅力吗?那就使用Android(安卓)LiveCD
  5. Android初中级阶段――一个新的开始,新的起点
  6. 重看android(二) android启动
  7. 访问接口,ios可以Android却不可以要么超时,要么数据异常
  8. 可显示Android设备选择列表,并进入指定Android设备Console的Shell
  9. [Android(安卓)Develop_002]-Android(安卓)UI Layout

随机推荐

  1. Android ExpandableListView显示模板
  2. Android与Js交互获取返回值
  3. Android CTS
  4. openssl移植android
  5. Android 随手势进行3D旋转的源码
  6. Android(安卓)判断程序是否是系统程序
  7. Android:week 13总结 绑定服务、音乐播放
  8. Android中按返回键怎么退出一个用程序
  9. Android学习笔记4——Activity的生命周期
  10. android http json请求3种不同写法