Intent详解(二)----Intent过滤器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zys_1997/article/details/79123726

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

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

标签

属性

说明

<action>

android:name

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

<category>

android:name

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

 

 

<data>

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代码示例:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".MainActivity"
        android:label="MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".SecondActivity"
        android:label="SecondActivity">
        <intent-filter tools:ignore="AppLinkUrlError">
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

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


测试时需要注意,在两个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<data>标签中的属性进行匹配,如果<data>标签指定了协议,主机名,路径,端口等,则需要完全匹配,任何不匹配的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的内容完全一致(协议,主机名,路径,端口等)才可以匹配。

展开阅读全文

没有更多推荐了,返回首页