weijunfeng
4/8/2019 - 7:16 AM

Uri详解

Uri详解
       在上面的翻译中如果你认真看的话你会发现在谷歌的官方文档中提到了ContentResolver(内容解析者),外界可以通过ContentResolver接口来访问ContentProvider(内容提供者)中的数据。但是在详细了解ContentResolver之前有一项工作是必须要做的,那就是先理解Uri,在谷歌文档中也有介绍,接下来我们就来详细的学习下Uri这个类
Uri 通用资源标志符(Universal Resource Identifier)Uri代表要操作的数据,Android中可用的每种资源 - 图像、视频片段等都可以用Uri来表示。Uri的结构由以下几个部分组成
scheme、authority、path、query和fragment组成。其中authority又分为host和port。它的格式根据划分的详细程度可以分为三种
如下:
[scheme:][scheme-specific-part][#fragment]
[scheme:][//authority][path][?query][#fragment] 
[scheme:][//host:port][path][?query][#fragment]——最详细的划分形式

看到这里肯定有人糊里糊涂的,接着我们就来举一个例子来帮助大家详细的理解Uri这个类的结构
假如有这么一个Uri:http://www.baidu.com:8080/yourpath/fileName.html?id=15&name=du#dmk
你能将上述Uri进行提取吗?接着我们就比着标准的格式[scheme:][//host:port][path][?query][#fragment]来将这个Uri各个部分提取出来
scheme:根据标准格式可以看出这里的scheme就是Uri前面//前面的部分这里也就是http:。
fragment:dmk这个也是比较容易找到的,在#后面
query:id=15&name=du#dmk。从标准格式可以看到在"#"之前"?"之后的部分是query,在这里当然就是id=15&name=du#dmk了。
authority:从格式二中可以看到authority是在//后的部分,它的终点就是在path之前所以这里的authority就是www.baidu.com:8080
path:path就是?之前,主机之后的部分那就是yourpath/fileName.html
host和port:因为主机可以分为host和port所以这里的host和port分别为:www.baidu.com和8080
这里要提醒大家注意的是:在Uri中并不是上述所有的字段都必须有的除了scheme、authority是必须要有的,其它的几个path、query、fragment,它们每一个可以选择性的要或不要,但顺序不能变,比方说在上述Uri中没有path那它的格式就为:http://www.baidu.com:8080/?id=15&name=du#dmk。
在理解了Uri的格式之后,有的人可能会说Uri的各个字段能否用代码获取?答案是肯定的
这里我们同样以http://www.baidu.com:8080/yourpath/fileName.html?id=15&name=du#dmk为例
getScheme() :获取Uri中的scheme字符串部分,在这里是http
getSchemeSpecificPart():获取Uri中的scheme-specific-part:部分,这里是:http://www.baidu.com:8080/yourpath/fileName.html?
getFragment():获取Uri中的fragment部分,即dmk
getAuthority():获取Uri中Authority部分,即www.baidu.com:8080
getPath():获取Uri中path部分,即/yourpath/fileName.html
getQuery():获取Uri中的query部分,即id=15&name=du
getHost():获取Authority中的Host字符串,即www.baidu.com
getPost():获取Authority中的Port字符串,即8080
到这里关于Uri的介绍就完了(这里的关于Uri的介绍的内容主要来自:Uri详解之——Uri结构与代码提取 和 Java魔法堂:URI、URL(含URL Protocol Handler)