加载中…
个人资料
狼骑
狼骑
  • 博客等级:
  • 博客积分:0
  • 博客访问:151,491
  • 关注人气:18
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

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

(2011-12-14 20:17:05)
标签:

it

分类: android

http://www.cnblogs.com/newcj/archive/2011/08/11/2135094.html

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

一、定义
 

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

  scheme://host:port/path or pathPrefix or pathPattern
 

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

上面那句最后的 “path or pathPrefix or 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 设置为 "**” 就可以了,整个 intent-filter 设置为:
intent-filter <wbr>之 <wbr>data <wbr>「scheme, <wbr>host, <wbr>port, <wbr>mimeType, <wbr>path, <wbr>pathPrefix, <wbr>pathPattern」intent-filter <wbr>之 <wbr>data <wbr>「scheme, <wbr>host, <wbr>port, <wbr>mimeType, <wbr>path, <wbr>pathPrefix, <wbr>pathPattern」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 设置为:
intent-filter <wbr>之 <wbr>data <wbr>「scheme, <wbr>host, <wbr>port, <wbr>mimeType, <wbr>path, <wbr>pathPrefix, <wbr>pathPattern」intent-filter <wbr>之 <wbr>data <wbr>「scheme, <wbr>host, <wbr>port, <wbr>mimeType, <wbr>path, <wbr>pathPrefix, <wbr>pathPattern」View Code
按 Ctrl+C 复制代码


参考:
【2】备份:Android 常用 mimeType 表 http://www.cnblogs.com/newcj/archive/2011/08/10/2134305.html

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有