一、定义
scheme, host, port, path, pathPrefix, pathPattern是用来匹配 Intent 中的 Data Uri 的。具体规则如下:
scheme://host:port/pathorpathPrefixorpathPattern
这里需要注意的是这里的scheme不是schema,也许你记得 xmlns:android="http://schemas.android.com/apk/res/android" 这段声明,你就会想起其中的 schema (至少我是这样想到了...- -!),但这里的scheme不是schema。虽然在写
AndroidManifest.xml 的时候,有智能提示,但是希望大家还是能注意到。
上面那句最后的 “pathorpathPrefixorpathPattern”
是指后面的 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 的知识请参考:
这里需要十分注意的是 Intent.setType(), Intent.setData,Intent.setDataAndType() 这三个方法!
另外需要注意的是,如果你在 data 标签,既设置了 mimeType 又设置了 scheme 之内的,那么你的 Intent 需要同时设置匹配的 data 与 mimeType 即调用 setDataAndType ,系统才能匹配到这个 Activity(即便你 mimeType 设置为 "*/*" 也是如此)。当然,如果你没有设置 mimeType,那么调用 setData 进行匹配,如果你设置了任何的 mimeType 将不会匹配到该 Activity。
二、区别
这里主要说的区别是path、pathPrefix、pathPattern之间的区别
-
path用来匹配完整的路径,如:http://example.com/blog/abc.html,这里将 path 设置为 /blog/abc.html 才能够进行匹配;
-
pathPrefix用来匹配路径的开头部分,拿上来的 Uri 来说,这里将 pathPrefix 设置为 /blog 就能进行匹配了;
-
pathPattern用表达式来匹配整个路径,这里需要说下匹配符号与转义。
匹配符号:
-
“*” 用来匹配0次或更多,如:“a*” 可以匹配“a”、“aa”、“aaa”...
-
“.” 用来匹配任意字符,如:“.” 可以匹配“a”、“b”,“c”...
-
因此 “.*” 就是用来匹配任意字符0次或更多,如:“.*html” 可以匹配 “abchtml”、“chtml”,“html”,“sdf.html”...
转义:因为当读取 Xml 的时候,“/” 是被当作转义字符的(当它被用作 pathPattern 转义之前),因此这里需要两次转义,读取 Xml 是一次,在 pathPattern 中使用又是一次。如:“*” 这个字符就应该写成 “//*”,“/” 这个字符就应该写成 “////”。
三、例子
例子1:如果我们想要匹配 http 以 “.pdf” 结尾的路径,使得别的程序想要打开网络 pdf 时,用户能够可以选择我们的程序进行下载查看。
我们可以将 scheme 设置为 “http”,pathPattern 设置为 “.*//.pdf”,整个 intent-filter 设置为:
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<data android:scheme="http" android:pathPattern=".*//.pdf"></data>
</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 设置为:
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data mimeType="*/*" />
</intent-filter>
这里设置 category 的原因是,创建的 Intent 的实例默认 category 就包含了 Intent.CATEGORY_DEFAULT ,google 这样做的原因是为了让这个 Intent 始终有一个 category。
例子3:如果我们做的是一个音乐播放软件,当文件浏览器打开某音乐文件的时候,使我们的应用能够出现在选择框里?这类似于文件关联了,其实做起来跟上面一样,也很简单,我们只用注册 android.intent.action.VIEW 与 mimeType 为 “audio/*” 就可以了,整个 intent-filter 设置为:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="audio/*" />
</intent-filter>
分享到:
相关推荐
Data、Type属性与Intent-filter配置首界面如图4所示,点击“查看图片”可以选择3个符合条件的Activity显示分别以全屏、图5和缩小三个不同的Activity显示图片。
IntentIntent-Filter思维导图
Activity_intent-filter
nlp-intent-toolkit, 基于OpenNLP的意向识别 nlp-intent-toolkit使用OpenNLP的插槽识别意图。这是使用OpenNLP训练系统接受自然语言输入,特别是通过speech-to-text源进行输入,并返回带有参数的识别操作的一个例子。...
Intent-based networks for 6G:Insights and challenges.pdf
<intent-filter></intent-filter> <meta-data/> </activity-alias> <intent-filter></intent-filter> <meta-data/> <intent-filter></intent-filter> <meta-data/> <grant-uri-permission/> ...
intent-action-send.7z
<intent-filter> android:name="android.intent.action.MAIN" /> android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> android:name="android.appwidget.action.APP...
Cisco Digital Network Architecture Powering business transformations with an intent-based networking strategy
2>intent-filter中可以声明多个action <intent-filter> </intent-filter> 3>如果intent中的action是Intent-filter中 声明的action中的一个,则action匹配成功。 4>如果intent-filter中没有声明任何的action,...
参考...,讲解的很好 1.什么是Intent(定义) Intent这个单词的意思就是”意图,目的,意向”,Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。 个
Intent filter 关于Action、Category属性详解源码 对应的博客文章链接: http://blog.csdn.net/a13429921973/article/details/9271973
1.高焕堂讲解 Intent-based Programming
android intent和intent action大全
这个例子主要讲下Intent Filter的用法。对应博客地址:http://blog.csdn.net/chenliqiang12345678/article/details/50568468
<intent-filter> <action android:name="android.intent.action.MAIN" /> android:name="android.intent.category.LAUNCHER" /> </intent-filter> android:label="@string/app_name_...
Checking_Intent-based_Communication_in_Android_With_Intent_Space
Checking Intent-based Communication in Android With Intent Space Analysis 发表在AisaCCS'2016上。作者提出了IntentScope工具,能够综合系统中所有的security extensions规则,得出一个完整的,所有APP之间能否...
Intent-based networks for 6G:Insights and challenges
有关intentdata和type的介绍及相关实例。