天天看點

Uri詳解之——Uri結構與代碼提取

前言:依然沒有前言……

相關部落格:

<a href="http://blog.csdn.net/harvic880925/article/details/44679239" target="_blank">1、《Uri詳解之——Uri結構與代碼提取》</a>

<a href="http://blog.csdn.net/harvic880925/article/details/44781557" target="_blank">2、《Uri詳解之二——通過自定義Uri外部啟動APP與Notification啟動》</a>

上幾篇給大家講了ContentProvider,裡面有用到Uri,可能很多同學對Uri是什麼,怎麼來的,這些都不是很熟悉,今天就給大家具體講講Uri

大家可能經常會看到在開發時,怎麼有的時候是URI,有的時候是Uri,這是怎麼回事?

名稱如此相像的兩個類是有什麼差別和聯系?

1.所屬的包不同。URI位置在java.net.URI,顯然是Java提供的一個類。而Uri位置在android.net.Uri,是由Android提供的一個類。是以初步可以判斷,Uri是URI的“擴充”以适應Android系統的需要。

2.作用的不同。URI類代表了一個URI(這個URI不是類,而是其本來的意義:通用資源标志符——Uniform Resource Identifier)執行個體。Uri類是一個不可改變的URI引用,包括一個URI和一些碎片,URI跟在“#”後面。建立并且轉換URI引用。而且Uri類對無效的行為不敏感,對于無效的輸入沒有定義相應的行為,如果沒有另外制定,它将傳回垃圾而不是抛出一個異常。

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

這裡分為三部分:

scheme、scheme-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參數可以有多個,每個用&amp;連接配接

scheme://authority/path1/path2/path3?id = 1&amp;name = mingming&amp;old#fragment

這裡有三個參數:

參數1:id,其值是:1

參數2:name,其值是:mingming

參數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

等等……

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

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

是以這是劃分最細的形式,其中host:port用冒号分隔,冒号前的是host,冒号後的port;

經過上面的講解,想必大家的Uri的結構就有所了解了,下面我們就執行個體看看各部分的識别方式。

先列出這三種Uri形式,好讓大家對比;

針對下面一個Uri字元串來比對一下各個部分:

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

scheme:匹對上面的兩個Uri标準形式,很容易看出在:前的部分是scheme,是以這個Uri字元串的sheme是:http

scheme-specific-part:很容易看出scheme-specific-part是包含在scheme和fragment之間的部分,也就是包括第二部分的[//authority][path][?query]這幾個小部分,所在這個Uri字元串的scheme-specific-part是://www.java2s.com:8080/yourpath/fileName.htm?stove=10&amp;path=32&amp;id=4 ,注意要帶上//,因為除了[scheme:]和[#fragment]部分全部都是scheme-specific-part,當然包括最前面的//;

fragment:這個是更容易看出的,因為在最後用#分隔的部分就是fragment,是以這個Uri的fragment是:harvic

下面就是對scheme-specific-part進行拆分了;

在scheme-specific-part中,最前端的部分就是authority,?後面的部分是query,中間的部分就是path

authority:很容易看出scheme-specific-part最新端的部分是:www.java2s.com:8080

query:在scheme-specific-part中,?後的部分為:stove=10&amp;path=32&amp;id=4

path:在**query:**在scheme-specific-part中,除了authority和query其餘都是path的部分:/yourpath/fileName.htm

又由于authority又一步可以劃分為host:port形式,其中host:port用冒号分隔,冒号前的是host,冒号後的是port,是以:

host:www.java2s.com

port:8080

上面我們通過執行個體講解了肉眼識别Uri更部分的方式,但在代碼中又要怎樣提取呢。下面就看看Uri中提取各部分的接口,依然以上面的Uri字元串為例:

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&amp;path=32&amp;id=4

getHost():擷取Authority中的Host字元串,即www.java2s.com

getPost():擷取Authority中的Port字元串,即8080

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

List&lt; String&gt; getPathSegments():上面我們的getPath()是把path部分整個擷取下來:/yourpath/fileName.htm,getPathSegments()的作用就是依次提取出Path的各個部分的字元串,以字元串數組的形式輸出。以上面的Uri為例:

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

Uri mUri = Uri.parse(mUriStr);  

List&lt;String&gt; pathSegList = mUri.getPathSegments();  

for (String pathItem:pathSegList){  

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

}  

打出來的清單為:

getQueryParameter(String key):在上面我們通過getQuery()擷取整個query字段:stove=10&amp;path=32&amp;id=4,getQueryParameter(String key)作用就是通過傳進去path中某個Key的字元串,傳回他對應的值。

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

mUri = Uri.parse(mUriStr);  

Log.d(tag,"getQueryParameter(\"stove\"):"+mUri.getQueryParameter("stove"));  

Log.d(tag,"getQueryParameter(\"id\"):"+mUri.getQueryParameter("id"));  

注意注意,我稍微更改了下字元串,把query中id的值去掉了!!!!!然後看看通過getQueryParameter("id")擷取它的值會得到什麼!

結果如下:

可以看到,在path中,即使針對某一個KEY不對它指派是允許的,但在利用getQueryParameter()擷取該KEY對應的值時,擷取到的是null;

絕對URI:以scheme元件起始的完整格式,如http://fsjohnhuang.cnblogs.com。表示以對辨別出現的環境無依賴的方式引用資源。 

相對URI:不以scheme元件起始的非完整格式,如fsjohnhuang.cnblogs.com。表示以對依賴辨別出現的環境有依賴的方式引用資源。

不透明URI:scheme-specific-part元件不是以正斜杠(/)起始的,如mailto:[email protected]。由于不透明URI無需進行分解操作,是以不會對scheme-specific-part元件進行有效性驗證。 

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

下面源碼中示範了各個提取函數的用法及結果;

如果本文有幫到你,記得關注哦

    本文轉自 一點點征服   部落格園部落格,原文連結:http://www.cnblogs.com/ldq2016/p/7250399.html,如需轉載請自行聯系原作者

繼續閱讀