1.Uri
通用資源标志符(Universal Resource Identifier, 簡稱"URI")。
Uri代表要操作的資料,Android上可用的每種資源 - 圖像、視訊片段等都可以用Uri來表示。
URI一般由三部分組成:
通路資源的命名機制。
存放資源的主機名。
資源自身的名稱,由路徑表示。
Android的Uri由以下三部分組成: "content://"、資料的路徑、标示ID(可選)
舉些例子,如:
所有聯系人的Uri: content://contacts/people
某個聯系人的Uri: content://contacts/people/5
所有圖檔Uri: content://media/external
某個圖檔的Uri:content://media/external/images/media/4
我們很經常需要解析Uri,并從Uri中擷取資料。
Android系統提供了兩個用于操作Uri的工具類,分别為UriMatcher 和ContentUris 。
雖然這兩類不是非常重要,但是掌握它們的使用,會便于我們的開發工作。
下面就一起看一下這兩個類的作用。
2.UriMatcher
UriMatcher 類主要用于比對Uri.
a) Public void addURI(String authority,String path,int code)
添加一個用于比對的URI,當比對成功時則code。URI可以是精确的字元串,uri中帶有*表示可比對任意text,#表示隻能比對數字。
Authority:用于比對的域名;
Path:比對路徑,*表示text的占位符,#表示使用數字的占位符;
Code:當使用比對成功後傳回code,值需要大于0,否則抛出IllegalArgument異常。
此方法将authority按照”/”進行拆分,然後将拆分後的每一部分儲存到UriMatcher類型的ArrayList中;在添加的時候會判斷目前authority是否已經添加過,若已加則break;若未添加過,則判斷是否含有”#”則将其辨別成1代表域名後面跟随的是數字;”*”辨別成2,代表域名後面跟随的是文本;0代表後面沒有跟随資料;最後建立一個新的UriMatcher對象添加到集合中。
b) Public int match(Uri uri)
嘗試在url中比對相對應的路徑
Uri:指定需要比對的url;
傳回值:在使用addURI時産生的code,若沒有比對則傳回-1。
使用uri. getPathSegments()擷取uri中各段存入list中,若list size為0或uri的Authority為null則傳回預設值(此預設值在new時指定,若為指定則為-1);
然後周遊ArrayLis<UriMatcher>進行比對uri。
使用方法如下。
首先第一步,初始化:
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
第二步注冊需要的Uri
matcher.addURI("com.yfz.Lesson", "people", PEOPLE);
matcher.addURI("com.yfz.Lesson", "person/#", PEOPLE_ID);
第三部,與已經注冊的Uri進行比對:
Uri uri = Uri.parse("content://" + "com.yfz.Lesson" + "/people");
int match = matcher.match(uri);
switch (match)
{
case PEOPLE:
return "vnd.android.cursor.dir/people";
case PEOPLE_ID:
return "vnd.android.cursor.item/people";
default:
return null;
}
3.ContentUris
ContentUris 類用于擷取Uri路徑後面的ID部分
1)為路徑加上ID: withAppendedId(uri, id)
比如有這樣一個Uri
Uri uri = Uri.parse("content://com.yfz.Lesson/people")
通過withAppendedId方法,為該Uri加上ID
Uri resultUri = ContentUris.withAppendedId(uri, 10);
最後resultUri為: content://com.yfz.Lesson/people/10
2)從路徑中擷取ID: parseId(uri)
Uri uri = Uri.parse("content://com.yfz.Lesson/people/10")
long personid = ContentUris.parseId(uri);
最後personid 為 :10