uri結(jié)構(gòu)和代碼提取

轉(zhuǎn)載 :http://blog.csdn.net/harvic880925/article/details/44679239

上幾篇給大家講了ContentProvider给赞,里面有用到Uri,可能很多同學(xué)對(duì)Uri是什么历筝,怎么來(lái)的,這些都不是很熟悉创泄,今天就給大家具體講講Uri

一芽卿、URI與Uri

大家可能經(jīng)常會(huì)看到在開(kāi)發(fā)時(shí),怎么有的時(shí)候是URI眨唬,有的時(shí)候是Uri,這是怎么回事好乐?

名稱(chēng)如此相像的兩個(gè)類(lèi)是有什么區(qū)別和聯(lián)系匾竿?

1.所屬的包不同。URI位置在java.net.URI,顯然是Java提供的一個(gè)類(lèi)蔚万。而Uri位置在android.net.Uri,是由Android提供的一個(gè)類(lèi)岭妖。所以初步可以判斷,Uri是URI的“擴(kuò)展”以適應(yīng)Android系統(tǒng)的需要笛坦。

2.作用的不同区转。URI類(lèi)代表了一個(gè)URI(這個(gè)URI不是類(lèi)苔巨,而是其本來(lái)的意義:通用資源標(biāo)志符——Uniform Resource Identifier)實(shí)例版扩。Uri類(lèi)是一個(gè)不可改變的URI引用,包括一個(gè)URI和一些碎片侄泽,URI跟在“#”后面礁芦。建立并且轉(zhuǎn)換URI引用。而且Uri類(lèi)對(duì)無(wú)效的行為不敏感悼尾,對(duì)于無(wú)效的輸入沒(méi)有定義相應(yīng)的行為柿扣,如果沒(méi)有另外制定,它將返回垃圾而不是拋出一個(gè)異常闺魏。

看不懂未状?沒(méi)關(guān)系,知道這個(gè)就可以了:Uri是Android開(kāi)發(fā)的析桥,擴(kuò)展了Java中URI的一些功能來(lái)特定的適用于android開(kāi)發(fā)司草,所以大家在開(kāi)發(fā)時(shí)艰垂,只使用Android 提供的Uri即可;

二埋虹、Uri結(jié)構(gòu)

(1)猜憎、基本形式:

[html]view plaincopy

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

這里分為三部分:

scheme、scheme-specific-part搔课、fragment

(2)胰柑、進(jìn)一步劃分:

如果進(jìn)一步劃分的話是這樣子的

[html]view plaincopy

[scheme:][//authority][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ù):

參數(shù)1:id卖鲤,其值是:1

參數(shù)2:name,其值是:mingming

參數(shù)3: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

等等……

(3)姑丑、終極劃分

其中authority,又可以分為host:port的形式,即再次劃分后是這樣的:

[html]view plaincopy

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

所以這是劃分最細(xì)的形式辞友,其中host:port用冒號(hào)分隔栅哀,冒號(hào)前的是host,冒號(hào)后的port;

三称龙、示例

經(jīng)過(guò)上面的講解留拾,想必大家的Uri的結(jié)構(gòu)就有所了解了,下面我們就實(shí)例看看各部分的識(shí)別方式鲫尊。

[html]view plaincopy

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

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

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

先列出這三種Uri形式痴柔,好讓大家對(duì)比;

針對(duì)下面一個(gè)Uri字符串來(lái)匹配一下各個(gè)部分:

[java]view plaincopy

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

四霜旧、代碼提取

上面我們通過(guò)實(shí)例講解了肉眼識(shí)別Uri更部分的方式错忱,但在代碼中又要怎樣提取呢。下面就看看Uri中提取各部分的接口挂据,依然以上面的Uri字符串為例:

[java]view plaincopy

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

另外還有兩個(gè)常用的:getPathSegments()、getQueryParameter(String key)

List< String> getPathSegments():上面我們的getPath()是把path部分整個(gè)獲取下來(lái):/yourpath/fileName.htm吟宦,getPathSegments()的作用就是依次提取出Path的各個(gè)部分的字符串篮洁,以字符串?dāng)?shù)組的形式輸出。以上面的Uri為例:

[java]view plaincopy

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

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

List?pathSegList?=?mUri.getPathSegments();

for(String?pathItem:pathSegList){

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

}

打出來(lái)的列表為:

getQueryParameter(String key):在上面我們通過(guò)getQuery()獲取整個(gè)query字段:stove=10&path=32&id=4殃姓,getQueryParameter(String key)作用就是通過(guò)傳進(jìn)去path中某個(gè)Key的字符串袁波,返回他對(duì)應(yīng)的值瓦阐。

[java]view plaincopy

String?mUriStr?="http://www.java2s.com:8080/yourpath/fileName.htm?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"));

注意注意,我稍微更改了下字符串篷牌,把query中id的值去掉了K!<霞铡4辽薄!然后看看通過(guò)getQueryParameter("id")獲取它的值會(huì)得到什么夭苗!

結(jié)果如下:

可以看到信卡,在path中,即使針對(duì)某一個(gè)KEY不對(duì)它賦值是允許的题造,但在利用getQueryParameter()獲取該KEY對(duì)應(yīng)的值時(shí)傍菇,獲取到的是null;

五、擴(kuò)展

1界赔、 絕對(duì)URI和相對(duì)URI

絕對(duì)URI:以scheme組件起始的完整格式丢习,如http://fsjohnhuang.cnblogs.com。表示以對(duì)標(biāo)識(shí)出現(xiàn)的環(huán)境無(wú)依賴(lài)的方式引用資源淮悼。

相對(duì)URI:不以scheme組件起始的非完整格式泛领,如fsjohnhuang.cnblogs.com。表示以對(duì)依賴(lài)標(biāo)識(shí)出現(xiàn)的環(huán)境有依賴(lài)的方式引用資源敛惊。

2渊鞋、不透明URI和分層URI

不透明URI:scheme-specific-part組件不是以正斜杠(/)起始的,如mailto:fsjohnhuang@xxx.com瞧挤。由于不透明URI無(wú)需進(jìn)行分解操作锡宋,因此不會(huì)對(duì)scheme-specific-part組件進(jìn)行有效性驗(yàn)證。

分層URI:scheme-specific-part組件是以正斜杠(/)起始的特恬,如http://fsjohnhuang.com执俩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市癌刽,隨后出現(xiàn)的幾起案子役首,更是在濱河造成了極大的恐慌,老刑警劉巖显拜,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衡奥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡远荠,警方通過(guò)查閱死者的電腦和手機(jī)矮固,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)譬淳,“玉大人档址,你說(shuō)我怎么就攤上這事盹兢。” “怎么了守伸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵绎秒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我尼摹,道長(zhǎng)替裆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任窘问,我火速辦了婚禮辆童,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惠赫。我一直安慰自己把鉴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布儿咱。 她就那樣靜靜地躺著庭砍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪混埠。 梳的紋絲不亂的頭發(fā)上怠缸,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音钳宪,去河邊找鬼揭北。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吏颖,可吹牛的內(nèi)容都是我干的搔体。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼半醉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疚俱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缩多,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤呆奕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后衬吆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體梁钾,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年咆槽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陈轿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圈纺。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秦忿,死狀恐怖麦射,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灯谣,我是刑警寧澤潜秋,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站胎许,受9級(jí)特大地震影響峻呛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辜窑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一钩述、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧穆碎,春花似錦牙勘、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至色徘,卻和暖如春恭金,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褂策。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工横腿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斤寂。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓蔑水,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扬蕊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搀别,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 一、URI與Uri 大家可能經(jīng)常會(huì)看到在開(kāi)發(fā)時(shí)尾抑,怎么有的時(shí)候是URI歇父,有的時(shí)候是Uri,這是怎么回事再愈? 名稱(chēng)如此相...
    Ten_Minutes閱讀 8,175評(píng)論 4 8
  • 之前在做圖像裁剪功能的時(shí)候涉及到了Uri榜苫,以及聯(lián)想到ContentProvider中也使用到了Uri,對(duì)這塊內(nèi)容還...
    陳利健閱讀 9,356評(píng)論 0 14
  • 代碼提取 上面我們通過(guò)實(shí)例講解了肉眼識(shí)別Uri更部分的方式翎冲,但在代碼中又要怎樣提取呢垂睬。下面就看看Uri中提取各部分...
    LandBlink閱讀 2,082評(píng)論 0 0
  • 首先,先來(lái)說(shuō)一下什么是URI,URI是英文Uniform Resource Identifier即統(tǒng)一資源識(shí)別符驹饺,...
    Ggx的代碼之旅閱讀 8,734評(píng)論 0 11
  • 項(xiàng)目里用到了許多Uri钳枕,Url,Urn相關(guān)東西赏壹,一直對(duì)其的定義模糊不清鱼炒,趁迭代開(kāi)發(fā)周期,對(duì)一些模糊的東西弄清楚 內(nèi)...
    樸文閱讀 328評(píng)論 0 0