android intentFilter 详解

原创 2016年06月01日 13:45:46

1 概述

activity的启动分为隐式和显式两种,要使用隐式的启动,那么intentFilter是非常重要的一个知识点。

这里将讲解intentFilter的匹配规则。

2 基本形式

<activity
    android:name="com.tencent.tauth.AuthActivity"
    android:launchMode="singleTask"
    android:noHistory="true"
    android:taskAffinity="com.coohuaclient">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>

        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>

        <data android:scheme="tencent1101354300"/>
    </intent-filter>
</activity>

可以看到,intentFilter中有action,category,以及data这几种形式的信息。

3 action匹配规则

在xml中的intent-filter中可以配置多个action值,在隐式启动的intent中,最多只能指定一个action值,要想隐式启动成功,则必须指定这个action的值,且这个action值必须匹配上xml配置的任意一个值。

值得注意的是,action是区分大小写的。

4 category匹配规则

在隐式启动的intent中,系统都会默认加上android.intent.category.DEFAULT这种category,因此,在xml中也必须指定这种值,这是成功调用的前提条件。category的规则和action不大相同。分为2种情况;

intent中含有category:
那么这些category必须都匹配上xml指定的值。

intent中没有category:
这种情况下,系统会在intent中设置默认的category,也就是android.intent.category.DEFAULT,如果这个值能匹配上xml中指定的,那么也能调用成功。

5 data匹配规则

data的数据相对比较复杂,我们先看看它的完整数据项:

<data
      android:mimeType="image/*" 
      android:scheme="string"
      android:host="string"
      android:port="string"
      android:path="string"
      android:pathPattern="string"
      android:pathPrefix="string"
      />

可以看到,data由两部分组成,一部分是mimeType代表了数据的媒体类型,其他的是URI,指定了资源的位置。

看看URI的结构:

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

例如:
content://com.baidu.haha:8080/dir/src/text.txt
http://www.baidu.com:80/dir/src/text.txt

上面的两种例子说明了URI的格式对。

这里值得说明的是path,pathPrefix以及pathPattern的区别,path指的是完整的路径,例如上诉例子中path代表“/dir/src/text.txt”,而pathPrefix代表了完整路径的起始部分,可以是/dir也可以是/dir/src,pathPattern则是符合正则表达式的路径,可以用正则表达式来表示路径,从而实现匹配。值得注意的是,pathPattern使用中,如果要表达例如*这类在正则表达式中有作用的字符,那么需要进行转义,但是写成“*”是不行的,因为清单文件是一个xml文件,他在被系统读取到内存的时候,会被转义一次,当pathPattern被当作正则表达式的读取的时候又会转义一次,所以这里有两次转义。所以,应该写成“\\*”,而“\”则要写成”\\\\

data如下的两种写法效果一致:

<intent-filter>
    <data android:scheme="file" android:host="www.baidu.com"/>
</intent-filter>

<intent-filter>
    <data android:scheme="file"/>
    <data android:host="www.baidu.com"/>
</intent-filter>

6 注意事项

使用隐式启动的时候,最好判断一下是否有匹配该隐式intent的activity,否则启动会出错。要判断是否有符合条件的activity有两种方法,一是使用packageManager的resolveActivity方法,一是使用Intent的resolveActivity,如果找不到匹配的就返回null,我们可以根据返回值判断是否有合适的activity。

看看方法:

public ActivityInfo resolveActivityInfo(PackageManager pm, int flags)

这里的flags需要解释一下,我们一般会使用MATCH_DEFAULT_ONLY这个标志位,因为这个标志位代表了,仅仅返回在xml中声明了android.intent.category.DEFAULT的activity,而这是隐式启动成功的前提条件。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android中IntentFilter匹配规则详解——Android开发艺术探索笔记

启动Activity的方式分为两种,显示和隐式调用。显示调用很简单,直接指明要启动的Activity就可以了,这里主要介绍一下隐式调用。隐式调用需要Intent能够匹配目标组件的IntentFilte...
  • L664675249
  • L664675249
  • 2016年02月06日 14:51
  • 3683

IntentFilter 的匹配规则

我们知道,启动Activity分为两种,显示调用和隐世调用。二者的区别这里不多说,显示调用需要明确的指定被启动对象的组件信息,包括包名和类名,而隐式调用需要明确知道组件信息。原则上一个Intent不应...
  • qq_31307919
  • qq_31307919
  • 2016年05月12日 18:08
  • 312

android 蓝牙通信(一)

1、需要在AndroidMainfest.xml里声明蓝牙权限
  • u012764110
  • u012764110
  • 2015年09月23日 16:01
  • 805

如何拿到插件Apk的Intent Filter?

加载插件时需要获取到插件APK的详细信息,比如AndroidManifest.xml中注册的四大组件。Android SDK提供了接口,如下: PackageManager pm = getPack...
  • dingjikerbo
  • dingjikerbo
  • 2016年02月03日 22:51
  • 995

你必须弄懂的Intent Filter匹配规则

Intent简介       Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent...
  • mynameishuangshuai
  • mynameishuangshuai
  • 2016年06月14日 17:14
  • 16146

Intent和IntentFilter的区别详解

Intent   Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Int...
  • generallizhong
  • generallizhong
  • 2015年06月06日 12:08
  • 1126

BroadcastReceiver源码解析(二)

广播注册部分见BroadcastReceiver源码解析(一)4,BroadcastReceiver之源码分析 4.1,动态注册过程源码分析在Activity中动态注册广播时,在注册方法之前其实省略了...
  • tiefeng0606
  • tiefeng0606
  • 2016年05月12日 09:14
  • 7785

Intent及其七大属性及intent-filter设置

Intent及其七大属性一、任务与回退栈:(一)、任务Task:①. 概念:一个任务(task)就是在执行某项工作时与用户进行交互的Activity的集合。这些Activity按照被打开的顺序依次被安...
  • wuqingyidongren
  • wuqingyidongren
  • 2016年05月23日 11:31
  • 5392

Android Bluetooth蓝牙开发:发现Bluetooth蓝牙设备(1)

 Android Bluetooth蓝牙开发:发现Bluetooth蓝牙设备(1) Android Bluetooth蓝牙作为设备,要与其他蓝牙设备互联,那么先决条件就是已经被发现,本文先简介...
  • zhangphil
  • zhangphil
  • 2016年01月15日 17:11
  • 5795

Intent和IntentFilter的区别详解

Intent   Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Int...
  • qq_29443203
  • qq_29443203
  • 2017年05月25日 09:36
  • 130
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android intentFilter 详解
举报原因:
原因补充:

(最多只允许输入30个字)