一、Uri和URI:
- 所属包不同。URI位置在
java.net.URI
,显然是Java提供的一个类。而Uri位置在android.net.Uri
,是由Android提供的一个类,所以可以判断,Uri是URI的”扩展“以适应Android系统的需要。 - 作用不同。URI代表一个URI(不是类,而是其本来的意义:通用资源标识符——Unifor Resour Identifier)实例。Uri类是一个不可改变的URI引用,包括一个URI和一些碎片。
总的来说:Uri是Android开发的,扩展了Java中的URI的一些功能来特定的是用于Android开发,所以大家在开发时,只需要使用Android 提供的Uri即可;
二、Uri结构:
- 基本形式:
[scheme:]scheme-specific-part[#fragment]
这里分为三部分:
scheme , cheme-specific-part , fragment - 进一步划分:
如果进一步划分的话是这样子的:[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
- getScheme():获取Uri中的scheme字符串部分,这里即:
http
- getSchemeSpecificPart():获取Uri中的scheme-specific-part部分,这里即:
//www.java2s.com:8080/yourpath/fileName.html
- getFragment():获取Uri中的Fragment部分,这里即:
harvir
- getAuthority():获取Uri中的Authority部分,这里即:
www.java2s.com:8080
- getPath():获取Uri中的path部分,这里即:
yourpath/fileName.html
- getQuery():获取Uri中的query部分,这里即:
stove=10&path=32&id=4
- getHost():获取Authority中的Host部分,这里即:
www.java2s.com
- 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。