Uri详解

一、Uri和URI:

  1. 所属包不同。URI位置在java.net.URI,显然是Java提供的一个类。而Uri位置在android.net.Uri,是由Android提供的一个类,所以可以判断,Uri是URI的”扩展“以适应Android系统的需要。
  2. 作用不同。URI代表一个URI(不是类,而是其本来的意义:通用资源标识符——Unifor Resour Identifier)实例。Uri类是一个不可改变的URI引用,包括一个URI和一些碎片。
    总的来说:Uri是Android开发的,扩展了Java中的URI的一些功能来特定的是用于Android开发,所以大家在开发时,只需要使用Android 提供的Uri即可;

二、Uri结构:

  1. 基本形式:
    [scheme:]scheme-specific-part[#fragment]
    这里分为三部分:
    scheme , cheme-specific-part , fragment
  2. 进一步划分:
    如果进一步划分的话是这样子的:
    [scheme:][//authority][path][?query][#fragment]

其中有下面几个规则:

  • path可以有多个,每个用/连接,比如:

    • scheme://authority/path1/path2/path3?query#fragment
  • query参数可以带有对应的值,也可以不带,如果带对应的值用=表示,如:

    • scheme://authority/path1/path2/path3?id=1#fragment
    • 这里有一个参数id,它的值是1
  • query参数可以有多个,每个用&连接:

    • scheme://authority/path1/path2/path3?id=1&name=qzr&old#fragment
    • 这里三个参数:
      • 参数1:id,其值为1
      • 参数2:name,其值为qzr
      • 参数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.终极划分:
其中anthority,又可分为host:port的形式,即再次划分后是这样的:
[scheme:][/host:port][path][?query][#fragment]
所以这是划分最细的形式,其中host:port用冒号分割,冒号前是host,后是port

三、示例:

常见的Uri的结构已有所了解,下面看看各部分的识别方式:
[scheme:]scheme-specific-part[#fragment]
[scheme:][//authority][path][?query][#fragment]
[scheme:][//host:port][path][?query][#fragment]

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

http://www.java2s.com:8080/yourpath/fileName.html?stove=10&path=32&id=4#harvic
  • scheme:很容易看出在:前的部分是scheme,所以这个Uri字符串的scheme是:http
  • scheme-specific-part:scheme和fragment之间的部分。//www.java2s.com:8080/yourpath/fileName.html?stove=10&path=32&id=4注意带上//
  • fragment:最容易看出,因为在最后用#分割的部分即使fragment。harvic
  • authority:很容易看出scheme-specific-part最前端的部分是:www.java2s.com:8080
  • query:?后的部分,即stove=10&path=32%id=4
  • path:在scheme-specific-part中,除了authority和query其余部分都是path,即:/yourpath/fileName.html
  • host:www.java2s.com
  • port:8080

四、代码提取:

上面说了肉眼识别Uri各个部分的方式,但是在代码中又要怎样提取?依然以上面的例子进行演示

http://www.java2s.com:8080/yourpath/fileName/html?stove=10&path=32&id=4#harvic
  1. getScheme():获取Uri中的scheme字符串部分,这里即:http
  2. getSchemeSpecificPart():获取Uri中的scheme-specific-part部分,这里即://www.java2s.com:8080/yourpath/fileName.html
  3. getFragment():获取Uri中的Fragment部分,这里即:harvir
  4. getAuthority():获取Uri中的Authority部分,这里即:www.java2s.com:8080
  5. getPath():获取Uri中的path部分,这里即:yourpath/fileName.html
  6. getQuery():获取Uri中的query部分,这里即:stove=10&path=32&id=4
  7. getHost():获取Authority中的Host部分,这里即:www.java2s.com
  8. getPost():获取Authority中的Port部分,这里即:8080

另外还有两个常用的:getPathSegments()getQueryParameter(String key)
9. List getPathSegments():上面的getPath()是把path部分整个获取下来:/yourpath/fileName.html,而getPathSegments()的作用是依次提取出path的各个部分的字符串,以字符串数组的形式输出,以上面Uri为例:

String mUriStr = "http://www.java2s.com:8080/yourpath/fileName.html?stove=10&path=32&id=4#harvic";
Uri mUri = Uri.parase(mUriStr);
List<String> pathSegList = mUri.getPathSegments();
for(String pathItem : pathSegList){
    Log.d("qzr","pathSegItem:"+pathItem);
}

这里写图片描述

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

String mUriStr = "http://www.java2s.com:8080/yourpath/fileName.html?stove=10&path=32&id#harvic";
mUri = Uri.parse(mUriStr);
Log.d(tag,"getQueryParameter(\"stove\"):"+mUri.getQueryParameter("stove"));
Log.d(tag,"getQueryParameter(\"id\"):"+mUri.getQueryParameter("id"));

注意!稍微更改了下字符串,去掉了id的值!!!看看getQueryParameter(“id”)的取值!
这里写图片描述

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

猜你喜欢

转载自blog.csdn.net/adonis044/article/details/80039782
URI