之前在做圖像裁剪功能的時(shí)候涉及到了Uri,以及聯(lián)想到ContentProvider中也使用到了Uri问窃,對(duì)這塊內(nèi)容還不是非常熟悉,于是在這里做一個(gè)總結(jié)。
java中的URI和Android中的Uri有什么區(qū)別雇初?
- 1.所屬的包不同。URI位置在java.net.URI减响,顯然是Java提供的一個(gè)類靖诗。而Uri位置在android.net.Uri,是由Android提供的一個(gè)類。所以初步可以判斷支示,Uri是URI的“擴(kuò)展”以適應(yīng)Android系統(tǒng)的需要刊橘。
- 2.作用的不同。URI類代表了一個(gè)URI(這個(gè)URI不是類颂鸿,而是其本來(lái)的意義:通用資源標(biāo)志符——Uniform Resource Identifier)實(shí)例促绵。Uri類是一個(gè)不可改變的URI引用,包括一個(gè)URI和一些碎片嘴纺,URI跟在“#”后面败晴。建立并且轉(zhuǎn)換URI引用。而且Uri類對(duì)無(wú)效的行為不敏感栽渴,對(duì)于無(wú)效的輸入沒(méi)有定義相應(yīng)的行為尖坤,如果沒(méi)有另外制定,它將返回垃圾而不是拋出一個(gè)異常闲擦。
Uri的結(jié)構(gòu)
- [scheme:]scheme-specific-part[#fragment]
- [scheme:][//authority][path][?query][#fragment]
- [scheme:][//host:port][path][?query][#fragment]
其中有下面幾個(gè)規(guī)則
- path可以有多個(gè)慢味,每個(gè)用/連接,比如**scheme://authority/path1/path2/path3?query#fragment
- query參數(shù)可以帶有對(duì)應(yīng)的值墅冷,也可以不帶纯路,如果帶對(duì)應(yīng)的值用=表示,如:scheme://authority/path1/path2/path3?id = 1#fragment俺榆,這里有一個(gè)參數(shù)id感昼,它的值是1
- query參數(shù)可以有多個(gè),每個(gè)用&連接
scheme://authority/path1/path2/path3?id=1&name = mingming&old#fragment
這里有三個(gè)參數(shù):id罐脊,其值是:1定嗓;name蜕琴,其值是:mingming; old宵溅,沒(méi)有對(duì)它賦值凌简,所以它的值是null。 - 在android中恃逻,除了scheme雏搂、authority是必須要有的,其它的幾個(gè)path寇损、query凸郑、fragment,它們每一個(gè)可以選擇性的要或不要矛市,但順序不能變芙沥,比如:
其中"path"可不要:scheme://authority?query#fragment
其中"path"和"query"可都不要:scheme://authority#fragment
其中"query"和"fragment"可都不要:scheme://authority/path
"path","query","fragment"都不要:scheme://authority
舉例分析
http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic
- scheme:匹對(duì)上面的兩個(gè)Uri標(biāo)準(zhǔn)形式,很容易看出在:前的部分是scheme浊吏,所以這個(gè)Uri字符串的sheme是:http
- scheme-specific-part:很容易看出scheme-specific-part是包含在scheme和fragment之間的部分而昨,也就是包括第二部分的[//authority][path][?query]這幾個(gè)小部分,所在這個(gè)Uri字符串的scheme-specific-part是://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4 找田,注意要帶上//歌憨,因?yàn)槌薣scheme:]和[#fragment]部分全部都是scheme-specific-part,當(dāng)然包括最前面的//墩衙;
- fragment:這個(gè)是更容易看出的务嫡,因?yàn)樵谧詈笥?分隔的部分就是fragment,所以這個(gè)Uri的fragment是:harvic下面就是對(duì)scheme-specific-part進(jìn)行拆分了底桂;在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用冒號(hào)分隔捶码,冒號(hào)前的是host,冒號(hào)后的是port或链,所以:
- host:www.java2s.com
- port:8080
代碼提取
- 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
絕對(duì)URI和相對(duì)URI
- 絕對(duì)URI:以scheme組件起始的完整格式簇爆,如http://fsjohnhuang.cnblogs.com癞松。 表示以對(duì)標(biāo)識(shí)出現(xiàn)的環(huán)境無(wú)依賴的方式引用資源。
- 相對(duì)URI:不以scheme組件起始的非完整格式入蛆,如fsjohnhuang.cnblogs.com响蓉。表示以對(duì)依賴標(biāo)識(shí)出現(xiàn)的環(huán)境有依賴的方式引用資源。
對(duì)于Uri的使用哨毁,可以用來(lái)啟動(dòng)我們的應(yīng)用厕妖,可以傳值,也可以用于notification挑庶。
推薦一篇文章言秸,總結(jié)的很好。
http://blog.csdn.net/harvic880925/article/details/44781557