IntentFilter的匹配规则

原创 2016年05月30日 15:30:08

转载请注明出处:http://blog.csdn.net/a992036795/article/details/51538083

我们知道,启动Activity分为两种,显示调用和隐式调用。显示调用需要明确的指定被启动对象的组件信息,包括包名和类名,而隐式调用则不需要明确的指定组件信息。原则上一个Intent不应该即是显示调用又是隐式调用。如果二者共存的话以显示调用为主。
隐式调用需要Intent能够匹配目标组组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标的Activity。
IntentFilter中的过滤信息有action、category、data。

一个Activity中可以有多个Intent-Fileter,一个intent只要能匹配任何一组intent-filter即可成功启动对应的Activity。

一个Intent-Filter中的action、category、data可以有多个。只有一个Intent同时匹配action、category、data类别才算是完全匹配。BroadcastReceiver只需匹配action或data就可以启动。

那么怎么样才来匹配action、category、data呢?
1、action: intent指定的action,只要和intent-filter中指定的多个action中的一个action相同(区分大小写) 相同,就算匹配成功。
2、category:intent中指定的所有 category、必须在intent-filter中存在,才算匹配成功。(这里注意intent默认添加有category :android.intent.category.LAUNCHER,所有在activity的intent-filter中需添加android.intent.category.LAUNCHER。才能完成匹配。)
3、data:data和action类似,只要指定的data和intent-filter中的任意一个data匹配,就算匹配成功。(注意:如果在intent中没有指明scheme,默认为content和file。一个完整的URI必须要有 scheme和host)

最后,为了避免使用隐式启动方法找不到符合的activity而报错可以使用如下方法进行检查:

PackageManager的方法:

//flags  =  #MATCH_DEFAULT_ONLY  使用这个标志可以找到category添加 //"android.intent.category.DEFAULT"的activity
//返回最佳的匹配activity
 public abstract ResolveInfo resolveActivity(Intent intent, int flags);

或者:
//返回所有可以匹配的信息
    public abstract List<ResolveInfo> queryIntentActivities(Intent intent,
            int flags);

或者Intent中的方法:

//实质还是调用了packageMangager.resolveActivity()方法
    public ComponentName resolveActivity(PackageManager pm) {
        if (mComponent != null) {
            return mComponent;
        }

        ResolveInfo info = pm.resolveActivity(
            this, PackageManager.MATCH_DEFAULT_ONLY);
        if (info != null) {
            return new ComponentName(
                    info.activityInfo.applicationInfo.packageName,
                    info.activityInfo.name);
        }

        return null;
    }

结尾在提醒一句,android5.0 之后service只接受显示启动。

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

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

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

IntentFilter的匹配规则

启动Activity分为两种,显示调用和隐式调用
  • Young_xiaoT
  • Young_xiaoT
  • 2016年05月01日 23:44
  • 489

IntentFilter匹配规则讲解

前言Android启动activity有两种,显式调用跟隐式调用。显式调用大家平时用得比较多,调用时需要明确的指定被启动对象的组件信息,类名,隐式调用则不需要明确指定组件信息。下面用代码来解释什么是显...
  • dfskhgalshgkajghljgh
  • dfskhgalshgkajghljgh
  • 2016年06月14日 17:16
  • 613

IntentFilter的匹配规则

IntentFilter的匹配规则       启动Activity分为两种,显式调用和隐式调用,原则上一个Intent不应该既是显式调用又是隐式调用,如果二者共存的话以显示调用为主,这里介绍隐式调用...
  • u010800708
  • u010800708
  • 2017年05月25日 00:47
  • 87

IntentFilter的匹配规则

IntentFilter的匹配规则IntentFilter的匹配规则 简单讲解 代码 MainActivity AndroidManifestxml 代码注解 setAction addCategor...
  • u013814964
  • u013814964
  • 2016年04月05日 14:52
  • 122

IntentFilter的匹配规则

我们知道,启动Activity有两种方式,一种是显式调用,一种是隐式调用,显式调用这里就不多说,我们来说说隐式调用。隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息...
  • ltym2014
  • ltym2014
  • 2016年07月25日 23:08
  • 129

IntentFilter的匹配规则

IntentFilter的匹配规则IntentFilter的使用假如我们要隐式启动一个Activity我们需要成功匹配activity中的任意一个intent-filter。如果要成功匹配该inten...
  • a992036795
  • a992036795
  • 2017年02月07日 17:39
  • 264

IntentFilter的匹配规则

允许转载请注明出处。IntentFilter的匹配规则对于初学者来说,学习IntentFilter的匹配规则还是有难度的,对于里面的规则肯定是有模糊不清的,为此,笔者写此文章以解惑!启动Activit...
  • qq_31609983
  • qq_31609983
  • 2016年07月29日 22:56
  • 226

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

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

IntentFilter匹配规则-交朋友

作用 匹配规则 从actioncategorydata来说 从Intent与intent-filter的匹配来说 action匹配规则 category的匹配规则 data的匹配规则作用IntentF...
  • amoscxy
  • amoscxy
  • 2017年11月22日 18:14
  • 40
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IntentFilter的匹配规则
举报原因:
原因补充:

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