千家信息网

Android中的URI和Uri类有什么区别和联系

发表于:2024-10-20 作者:千家信息网编辑
千家信息网最后更新 2024年10月20日,本篇内容主要讲解"Android中的URI和Uri类有什么区别和联系",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Android中的URI和Uri类有什么
千家信息网最后更新 2024年10月20日Android中的URI和Uri类有什么区别和联系

本篇内容主要讲解"Android中的URI和Uri类有什么区别和联系",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Android中的URI和Uri类有什么区别和联系"吧!

一、URI与Uri

大家可能经常会看到在开发时,怎么有的时候是URI,有的时候是Uri,这是怎么回事?

名称如此相像的两个类是有什么区别和联系?

  • 1.所属的包不同。URI位置在java.net.URI,显然是Java提供的一个类。而Uri位置在android.net.Uri,是由Android提供的一个类。所以初步可以判断,Uri是URI的"扩展"以适应Android系统的需要。

  • 2.作用的不同。URI类代表了一个URI(这个URI不是类,而是其本来的意义:通用资源标志符--Uniform Resource Identifier)实例。Uri类是一个不可改变的URI引用,包括一个URI和一些碎片,URI跟在"#"后面。建立并且转换URI引用。而且Uri类对无效的行为不敏感,对于无效的输入没有定义相应的行为,如果没有另外制定,它将返回垃圾而不是抛出一个异常。

看不懂?没关系,知道这个就可以了:Uri是Android开发的,扩展了JAVA中URI的一些功能来特定的适用于Android开发,所以大家在开发时,只使用Android 提供的Uri即可;

二、Uri结构

(1)、基本形式:

[html] view plain copy

  1. [scheme:]scheme-specific-part[#fragment]

这里分为三部分:
scheme、scheme-specific-part、fragment

(2)、进一步划分:

如果进一步划分的话是这样子的

[html] view plain copy

  1. [scheme:][//authority][path][?query][#fragment]

其中有下面几个规则:

  • path可以有多个,每个用/连接,比如
    scheme://authority/path2/path3/path4?query#fragment

  • query参数可以带有对应的值,也可以不带,如果带对应的值用=表示,如:
    scheme://authority/path2/path3/path4?id = 1#fragment,这里有一个参数id,它的值是1

  • query参数可以有多个,每个用&连接
    scheme://authority/path2/path3/path4?id = 1&name = mingming&old#fragment
    这里有三个参数:
    参数1:id,其值是:1
    参数2:name,其值是:mingming
    参数3:old,没有对它赋值,所以它的值是null

  • 在android中,除了scheme、authority是必须要有的,其它的几个path、query、fragment,它们每一个可以选择性的要或不要,但顺序不能变,比如:
    其中"path"可不要:scheme://authority?query#fragment
    其中"path"和"query"可都不要:scheme://authority#fragment
    其中"query"和"fragment"可都不要:scheme://authority/path
    "path","query","fragment"都不要:scheme://authority
    等等……

(3)、终极划分

其中authority,又可以分为host:port的形式,即再次划分后是这样的:

[html] view plain copy

  1. [scheme:][//host:port][path][?query][#fragment]

所以这是划分最细的形式,其中host:port用冒号分隔,冒号前的是host,冒号后的port;

三、示例

经过上面的讲解,想必大家的Uri的结构就有所了解了,下面我们就实例看看各部分的识别方式。

[html] view plain copy

  1. [scheme:]scheme-specific-part[#fragment]

  2. [scheme:][//authority][path][?query][#fragment]

  3. [scheme:][//host:port][path][?query][#fragment]

先列出这三种Uri形式,好让大家对比;
针对下面一个Uri字符串来匹配一下各个部分:

[java] view plain copy

  1. http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic

  • scheme:匹对上面的两个Uri标准形式,很容易看出在:前的部分是scheme,所以这个Uri字符串的sheme是:http

  • scheme-specific-part:很容易看出scheme-specific-part是包含在scheme和fragment之间的部分,也就是包括第二部分的[//authority][path][?query]这几个小部分,所在这个Uri字符串的scheme-specific-part是://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4 ,注意要带上//,因为除了[scheme:]和[#fragment]部分全部都是scheme-specific-part,当然包括最前面的//;

  • fragment:这个是更容易看出的,因为在最后用#分隔的部分就是fragment,所以这个Uri的fragment是:harvic
    下面就是对scheme-specific-part进行拆分了;
    在scheme-specific-part中,最前端的部分就是authority,?后面的部分是query,中间的部分就是path

  • authority:很容易看出scheme-specific-part最新端的部分是:www.java2s.com:8080

  • query:在scheme-specific-part中,?后的部分为:stove=10&path=32&id=4

  • path:在**query:**在scheme-specific-part中,除了authority和query其余都是path的部分:/yourpath/fileName.htm
    又由于authority又一步可以划分为host:port形式,其中host:port用冒号分隔,冒号前的是host,冒号后的是port,所以:

  • host:www.java2s.com

  • port:8080

四、代码提取

上面我们通过实例讲解了肉眼识别Uri更部分的方式,但在代码中又要怎样提取呢。下面就看看Uri中提取各部分的接口,依然以上面的Uri字符串为例:

[java] view plain copy

  1. http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic

  • getScheme() :获取Uri中的scheme字符串部分,在这里即,http

  • getSchemeSpecificPart():获取Uri中的scheme-specific-part:部分,这里是://www.java2s.com:8080/yourpath/fileName.htm?

  • getFragment():获取Uri中的Fragment部分,即harvic

  • getAuthority():获取Uri中Authority部分,即www.java2s.com:8080

  • getPath():获取Uri中path部分,即/yourpath/fileName.htm

  • getQuery():获取Uri中的query部分,即stove=10&path=32&id=4

  • getHost():获取Authority中的Host字符串,即www.java2s.com

  • getPost():获取Authority中的Port字符串,即8080

另外还有两个常用的:getPathSegments()、getQueryParameter(String key)

  • List< String> getPathSegments():上面我们的getPath()是把path部分整个获取下来:/yourpath/fileName.htm,getPathSegments()的作用就是依次提取出Path的各个部分的字符串,以字符串数组的形式输出。以上面的Uri为例:

[java] view plain copy

  1. String mUriStr = "http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic";

  2. Uri mUri = Uri.parse(mUriStr);

  3. List pathSegList = mUri.getPathSegments();

  4. for (String pathItem:pathSegList){

  5. Log.d("qijian","pathSegItem:"+pathItem);

  6. }

打出来的列表为:

  • getQueryParameter(String key):在上面我们通过getQuery()获取整个query字段:stove=10&path=32&id=4,getQueryParameter(String key)作用就是通过传进去path中某个Key的字符串,返回他对应的值。

[java] view plain copy

  1. String mUriStr = "http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id#harvic";

  2. mUri = Uri.parse(mUriStr);

  3. Log.d(tag,"getQueryParameter(\"stove\"):"+mUri.getQueryParameter("stove"));

  4. Log.d(tag,"getQueryParameter(\"id\"):"+mUri.getQueryParameter("id"));

注意注意,我稍微更改了下字符串,把query中id的值去掉了!!!!!然后看看通过getQueryParameter("id")获取它的值会得到什么!
结果如下:

可以看到,在path中,即使针对某一个KEY不对它赋值是允许的,但在利用getQueryParameter()获取该KEY对应的值时,获取到的是null;

五、扩展

1、 绝对URI和相对URI

绝对URI:以scheme组件起始的完整格式,如http://fsjohnhuang.cnblogs.com。表示以对标识出现的环境无依赖的方式引用资源。
相对URI:不以scheme组件起始的非完整格式,如fsjohnhuang.cnblogs.com。表示以对依赖标识出现的环境有依赖的方式引用资源。

2、不透明URI和分层URI

不透明URI:scheme-specific-part组件不是以正斜杠(/)起始的,如mailto:fsjohnhuang@xxx.com。由于不透明URI无需进行分解操作,因此不会对scheme-specific-part组件进行有效性验证。
分层URI:scheme-specific-part组件是以正斜杠(/)起始的,如http://fsjohnhuang.com。

到此,相信大家对"Android中的URI和Uri类有什么区别和联系"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

部分 字符 字符串 参数 形式 冒号 就是 组件 联系 方式 面的 开发 起始 两个 作用 实例 资源 不同 代码 位置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 与林地保护利用规划数据库比对 道琼斯反洗钱名单数据库介绍 吱信(上海)网络技术有限公司发红包 洛阳教育软件开发招聘信息 普通人怎么转行软件开发 java 数据库 xml 汇荣网络技术有限公司 江苏正规服务器生产商虚拟主机 著名软件开发商 摄像头软件开发教程 数据库通讯技术的特点 咋安全清空数据库 如何查看vs内置数据库 网络技术各种术语 网络安全法杜绝社会工程学入侵 深圳软件开发外包性价比 连接授权服务器失败怎么回事电脑 华为麒麟920服务器 大一数据库一到六章练习题 oracle数据库复杂查询 跨考网络安全与执法 数据库宕了数据库需要重启吗 深圳电脑软件开发如何收费 matlab视频得到数据库 项目表数据库 高科技卫星互联网 大足区技术软件开发服务常见问题 软件开发网等级 湖南岚鸿 网络安全模式下怎么重装系统 组织观看网络安全法宣传片
0