android intentFilter 匹配规则

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的结构:

://:/[||]

例如:

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,而这是隐式启动成功的前提条件。

时间: 2024-10-17 08:43:44

android intentFilter 匹配规则的相关文章

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

欢迎转载,转载请注明出处http://blog.csdn.net/l664675249/article/details/50640288 启动Activity的方式分为两种,显示和隐式调用.显示调用很简单,直接指明要启动的Activity就可以了,这里主要介绍一下隐式调用.隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息.只有一个Intent同时匹配action,category和data才算匹配成功. 示例 <intent-filter> <acti

Android启动模式以及IntentFilter匹配规则

一.Android的LaunchMode 共有四种启动模式 1.standard 标准启动模式,Activity的默认启动模式.Activity的每次启动都创建新的示例 2.singleTop 栈顶复用模式,当启动的Activity处于栈顶时,不再创建新的活动实例.将回调onNewIntent方法. 3.singleTask 栈内复用模式,当启动的Activity在一个栈中存在实例,不再创建新的实例,弹出在其之上的所有实例将其置于栈顶.同样会回调onNewIntent方法. 4.singleIn

Android IntentFilter 匹配原则浅析

1 Intent分为两大类,显式和隐式. 显式事件,就是指通过 component Name 属性,明确指定了目标组件的事件. 比如我们新建一个Intent,指名道姓的说,此事件用于启动名为"com.silenceburn.XXXX”的Activity,那么这就是一个显式事件. 隐式事件,就是指没有 component Name 属性,没有明确指定目标组件的事件. 比如系统向所有监控通话情况的程序发送的“来电话了!”的事件,由于系统不确定谁会处理这个事件,因此系统不会明确指定目标组件,也就是说没

Intent-filter匹配规则

Action:至少匹配一个  setAction(String)或者new Intent(String action); category:可以不添加匹配,但是如果添加必须匹配:  addCategory(String categoru)     当没有添加时:系统会设置默认的category:android.intent.category.DEFAULT; data:至少匹配一个,如果既要匹配data和Type就要使用setDataAndType(Uri data,String type);

Android中的Intent Filter匹配规则介绍

本文主要介绍了隐式Intent匹配目标组件的规则,若有叙述不清晰或是不准确的地方希望大家指出,谢谢大家: ) 1. Intent简介 Intent用于在一个组件(Component,如Activity.Service.Broadcast Receiver)中打开另一个组件. Intent可分为隐式(implicitly)和显式(explicitly)两种: Explicitly Intent:在知道要打开哪个具体的Component时使用,通过指定调用者和被调用者即可打开目标Component:

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

Intent简介 Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用.Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互.因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦.在SDK中给出了I

Intent 匹配规则

1.在AndroidManifest.xml中可以为 每个 Activity,Service 设置多个Intent-Filter; 在系统启动和程序安装之后,android会收集AndroidManifest.xml 中配置的 Intent-Filter. 每个intent-filter 从action category data三个量来过滤 intent. Intent-Filter和Intent的设置规则 1.每个intent-filter对象(这里是intent-filter不是 Andr

Activity 中 intent 匹配规则

要想使用隐式 Intent 成功启动 Activity, 必须保证 Intent 中 action.category.data 的设置和要启动的 Activity 的 IntentFilter 相匹配. Intent 和 IntentFilter 的使用方法: IntentFilter 中可以设置上的 1-n 个 action.0-n 个 category.0-n 个data Intent 上可以设置 1-n 个 action.0-n 个 category.1 个 data IntentFilt

Android 代码混淆规则

1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录toolsproguard下面.ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器.它可以检测并删除未使用的类,字段,方法和属性.它可以优化字节码,并删除未使用的指令.它可以将类.字段和方法使用短无意义的名称进行重命名.最后,预校验的Java6或针对Java MicroEdition的所述处理后的码.如果开启了混淆,Proguard默认情况下会对所有代码,包括第三方包都进行混淆,