IntentFilter 的匹配规则与例子

参考##

1.《Android开发艺术探索》

主要针对隐式调用,隐士调用需要intent能够匹配目标组件的IntentFilter所设置的信息,如:启动服务、广播、Activity等;
IntentFilter的过滤信息有action、category、data,
如下:

<!-- 对外处理推送,web打开app的中转Activity -->
        <activity
            android:name=".open.TransferActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
            <intent-filter android:priority="0x7FFFFFFF" >
                <action android:name="android.intent.action.VIEW" />
                <!-- 显示数据 -->
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <!-- 定义成浏览器类型,有URL需要处理时会过滤 -->
                <data
                    android:host="better.com"
                    android:scheme="open.better" />
            </intent-filter>
        </activity>

为匹配规则列表,需要同时匹配过滤列表中 action、category、data信息;

action的匹配规则###

action是一个字符串,系统也预定义了一些,我们也可以自定义,如要匹配,必须和intent中的action的完全一致,并区分大小写;
只要intent中的action能够和过滤规则中的任何一个action相同,即匹配成功;

常用的系统的自带的action:

  1. Intent.ACTION_MAIN( android.intent.action.MAIN ): 应用入口;
  2. Intent.ACTION_VIEW(android.intent.action.VIEW): 用于显示用户的数据,比较通用,会根据用户的数据类型打开相应的Activity;

category的匹配规则###

与action类型,系统也预定义了一些; 如果intent中含有category,如果目标组件中,含有此category,则表示匹配成功;另外系统会默认在intent添加 android.intent.category.DEFAULT,这个category,为了 activity能接收到隐式调用,需要在intent-filter中指定 DEFAULT这个category,如上图;

data的匹配规则###

data的匹配规则和action类似,如果过滤规则中,定义了data,那么intent中,也要定义可匹配的data;
data的语法结构

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

她其实就是由2部分组成:mimeType 和 URI,mimeType指定媒体类型,如:image/jpeg,
uri为:

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

path表示完整的路径信息;
pathPattern亦可表示路径,但可包含通配符(),如:"\", 表示匹配任何字符;
pathPrefix表示路径前缀;

data匹配规则
data要求intent中必须含有data数据,并且data数据能够完成匹配过滤规则中的某一个data。这里完全匹配指定的是过滤规则中的data部分也出现在了intent中的data中;

  1. 如下规则:
<!-- --> 
<intent-filter>
    <data android:mimeType="image/*"/>
    ....
</intent-filter>

指定媒体类型为所有图片,如:intent为 intent.setDataAndType(Uri.parse("file://abc"), "image/png") ;这种intentFilter虽然没有指定URI,系统会有默认值设定,默认值为content和file;即:URI的schema是有默认值的;
如要为intent指定完整的data,必须要调用 setDataAndType方法;


避免异常###

如果通过intent隐式意图来启动activity,如果没有任何匹配,App会crash,为避免此情况发生,
可以先判断一下,采用PackageManger的resolveActivity或 Intent的resolveActivity方法;


具体的例子###

回到,文章开头的示例配置,我们配置了,可以通过浏览器(category:android.intent.category.BROWSABLE),startActivity(android.intent.category.DEFAULT) 2种外部启动方式,来启动该Activity;

// 通过intent来启动,比如:其他app,打开本app,需要传递特定参数时
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse("open.better://better.com?type=otherInfo");  // type为传递的参数;
intent.setData(uri);
startActivity(intent);

// 通过http:// 链接形式启动
<a href="open.better://better.com?type=type01">打开Better</a>

// 具体解析:
Uri data = getIntent().getData();       // 来自外部链接
// 处理intent
 Intent bizIntent = null;
 // 来自 外部启动
if (data != null) {
            String scheme = data.getScheme();       // scheme
              // 如果来着 web 启动
                if (“open.better”.equals(scheme)) {
                    String host = data.getHost();                        // host
                    String type = StringUtils.convertToSafeString(data.getQueryParameter("type"));
   // 其他操作
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容