intent-filter 之 data

转:http://blog.sina.com.cn/s/blog_4b650d650100kq55.html

intent-filter 之 data 「scheme, host, port, mimeType, path, pathPrefix, pathPattern」

之前一直搞不很明白 AndroidManifest.xml 中 activity 标签下的 intent-filter 中 data 标签的属性含义,今天认真看了 Dev Guide,又在网上查询了大量相关资料,现把 data 标签中的属性含义做一个总结。
 

一、定义
 

scheme, host, port, path, pathPrefix, pathPattern 是用来匹配 Intent 中的 Data Uri 的。具体规则如下:
 

  scheme://host:port/pathor pathPrefixor pathPattern
 

这里需要注意的是这里的 scheme 不是schema,也许你记得 xmlns:android="http://schemas.android.com/apk/res/android" 这段声明,你就会想起其中的 schema (至少我是这样想到了...- -!),但这里的 scheme 不是 schema。虽然在写 AndroidManifest.xml 的时候,有智能提示,但是希望大家还是能注意到。

上面那句最后的 “pathor pathPrefixor pathPattern” 是指后面的 path 验证可以使用 data 属性中的 android:path、android:pathPrefix 或 pathPattern,你可以添加任意个 data 标签,由于是 “or” ,因此,只要其中任意一个 data 匹配,系统就会选择你的 Activity 启动,当然,如果别的 Activity 也有相同的 data 标签,系统就会给用户弹出一个 Chooser Dialog。

mimeType也是是用来匹配 Intent 的。比如,当你使用 Intent.setType("text/plain") ,那么系统将会匹配到所有注册 android:mimeType="text/plain" 的 Activity,想获取更多有关 mimeType 的知识请参考:【转】备份:Android 常用 mimeType 表

这里需要十分注意的是 Intent.setType(), Intent.setData,Intent.setDataAndType() 这三个方法!
 

  • setType 调用后设置 mimeType,然后将 data 置为 null;
  • setData 调用后设置 data,然后将 mimeType 置为 null;
  • setDataAndType 调用后才会同时设置 data 与 mimeType。
     

另外需要注意的是,如果你在 data 标签,既设置了 mimeType 又设置了 scheme 之内的,那么你的 Intent 需要同时设置匹配的 data 与 mimeType 即调用 setDataAndType ,系统才能匹配到这个 Activity(即便你 mimeType 设置为 "*/*" 也是如此)。当然,如果你没有设置 mimeType,那么调用 setData 进行匹配,如果你设置了任何的 mimeType 将不会匹配到该 Activity。

二、区别


  这里主要说的区别是 pathpathPrefixpathPattern 之间的区别
 

  • path 用来匹配完整的路径,如:http://example.com/blog/abc.html,这里将 path 设置为 /blog/abc.html 才能够进行匹配;
  • pathPrefix 用来匹配路径的开头部分,拿上面的 Uri 来说,这里将 pathPrefix 设置为 /blog 就能进行匹配了;
  • pathPattern 用表达式来匹配整个路径,这里需要说下匹配符号与转义。

匹配符号:

  1. “*” 用来匹配0次或更多,如:“a*” 可以匹配“a”、“aa”、“aaa”...
  2. “.” 用来匹配任意字符,如:“.” 可以匹配“a”、“b”,“c”...
  3. 因此 “.*” 就是用来匹配任意字符0次或更多,如:“.*html” 可以匹配 “abchtml”、“chtml”,“html”,“sdf.html”...

转义:

因为当读取 Xml 的时候,“\” 是被当作转义字符的(当它被用作 pathPattern 转义之前),因此这里需要两次转义,读取 Xml 是一次,在 pathPattern 中使用又是一次。如:“*” 这个字符就应该写成 “\\*”,“\” 这个字符就应该写成 “\\\\”。

三、一些例子

  例子1:如果我们想要匹配 http 以 “.pdf” 结尾的路径,使得别的程序想要打开网络 pdf 时,用户能够可以选择我们的程序进行下载查看。


我们可以将 scheme 设置为 “http”,pathPattern 设置为 “.*\\.pdf”,整个 intent-filter 设置为:

View Code

1 <intent-filter>
2     <action android:name="android.intent.action.VIEW"></action>
3     <category android:name="android.intent.category.DEFAULT"></category>
4     <data android:scheme="http" android:pathPattern=".*\\.pdf"></data>
5 </intent-filter>

复制代码

如果你只想处理某个站点的 pdf,那么在 data 标签里增加  android:host="yoursite.com" 则只会匹配 http://yoursite.com/xxx/xxx.pdf,但这不会匹配 www.yoursite.com,如果你也想匹配这个站点的话,你就需要再添加一个 data 标签,除了 android:host 改为 “www.yoursite.com” 其他都一样。
 

例子2:如果我们做的是一个IM应用,或是其他类似于微博之类的应用,如何让别人通过 Intent 进行调用分享出现在选择框里呢?
 

我们只用注册 android.intent.action.SEND 与 mimeType 为 “text/plain” 或 “*/*” 就可以了,整个 intent-filter 设置为:

View Code

1 <intent-filter>
2     <action android:name="android.intent.action.SEND" />
3     <category android:name="android.intent.category.DEFAULT" />
4     <data mimeType="*/*" />
5 </intent-filter>

复制代码

这里设置 category 的原因是,创建的 Intent 的实例默认 category 就包含了 Intent.CATEGORY_DEFAULT ,google 这样做的原因是为了让这个 Intent 始终有一个 category。

例子3:如果我们做的是一个音乐播放软件,当文件浏览器打开某音乐文件的时候,使我们的应用能够出现在选择框里?
 

这类似于文件关联了,其实做起来跟上面一样,也很简单,我们只用注册 android.intent.action.VIEW 与 mimeType 为 “audio/*” 就可以了,整个 intent-filter 设置为:

View Code

1 <intent-filter>
2     <action android:name="android.intent.action.VIEW" />
3     <category android:name="android.intent.category.DEFAULT" />
4     <data android:mimeType="audio/*" />
5 </intent-filter>
时间: 2024-08-01 20:38:42

intent-filter 之 data的相关文章

Android中的Intent Filter匹配规则简介_Android

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

Android中的Intent Filter匹配规则简介

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

Android中的Intent Filter简介

Intent是Android应用程序核心组件之间通信和传递信息的核心机制.与之相关的IntentFilter也具有相关的安全机制(测试)来进行约束.本文将对其进行详细介绍. 一.Intent和IntentFilter简介 一个应用程序的三个核心组件(活动,服务和广播接收器)都是通过消息即意图(Intents)来激活的.Intent消息传送是相同或不同应用中组件运行时晚绑定的一种机制.意图本身(一个意图对象)是一个包含被执行操作抽象描述的被动的数据结构.或,对于广播而言,是某件已经发生并被声明的事

详解Android中Intent对象与Intent Filter过滤匹配过程_Android

如果对Intent不是特别了解,可以参见博文<详解Android中Intent的使用方法>,该文对本文要使用的action.category以及data都进行了详细介绍.如果想了解在开发中常见Intent的使用,可以参见<Android中Intent习惯用法>. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 一.概述 我们知道,Intent是分两种的:显式Intent和隐式

Android菜鸟的成长笔记(9)——Intent与Intent Filter(下)

原文:[置顶] Android菜鸟的成长笔记(9)--Intent与Intent Filter(下) 接着上一篇的内容,下面我们再来看看Intent的Data与Type属性. 一.Data属性与Type属性 Data属性通常用于向Action属性提供操作的数据,Data属性接受一个Uri对象 格式:scheme://host:port/path 例如: content://com.android.contacts/contacts/1 tel:123 其中prot部分被省略了,contacts/

Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)

原文:[置顶] Android菜鸟的成长笔记(8)--Intent与Intent Filter(上) Intent代表了Android应用的启动"意图",Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,取决于Intent的各个属性. 一.显式的Intent 明确指定了要启动的组件的Intent我们称为显式的Intent 例如: package com.example.testintent; import android.app.Activity; impor

intent-隐式Intent(Explicit Intents)和Intent Filter进行比较

问题描述 隐式Intent(Explicit Intents)和Intent Filter进行比较 很多文档说道:如果Intent请求中没有设定Action类型,那么只要< intent-filter>中包含有Action类型,这个 Intent请求就将顺利地通过< intent-filter>的行为测试. 我写了应用左侧是:在一个应用中使用隐式Intent,没有指定Action,调用startActivity,出现报错:ActivityNotFoundException. 我是这

Android中的Intent广播(broadcast)简介

Intent可以使用sendBroadcast(), 在应用组件之间广播事件; 使用BroadReceiver类监听和响应Broadcast Intent, 需要注册(register)和过滤器(intent-filter); 1. 创建Broadcast Intent 构建需要广播的Intent, 包含Intent标识字符串, 和数据(data, extras), 使用sendBroadcast()发送; Intent标识字符串, 可以标识要广播的字符串, 应该是能够标志的唯一字符串, pub

Android简明开发教程七:Intents和Intent Filters

Android应用中的三个核心组件:Activities,Services和broadcast receivers都是通过称为"Intent"的消息来激活的. Android应用一个特点是"低耦合",各个Activities,Services和broadcast receivers相当独立,可以看成是一个个"迷你应 用",而Intent是这些"迷你应用"的粘合剂,Intent不但可以用于同一个Application之间Acti

Intent和IntentFilter详解

Intent用于启动Activity,Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介. 使用Intent启动组件的优势 1, Intent为组件的启动提供了一致的编程模型.无论想要启动的组件是Activity,Service, 还是BroadcastReceiver,都可以使用Intent封装启动的意图. 2, 在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合.使用Intent可以方便的达到这种高层次解耦的目的.