ContentProvider和ContentResolve
一、前言
在Android平臺中,各個Android 應用中可能需要互相傳遞資料。而ContentProvider類的作用就是在不同的應用之間進行資料的傳遞。
二、URI簡介
URI在AndroidContentProvider中很重要,URI類似於網路中的URL,是一條字串用於儲存資訊,或儲存資訊的地址。
對於一個URI:
content://com.milkz.providers.mytest/messages
Uri uri = Uri.parse(content://com.milkz.providers.mytest/messages);
content:// <---- Android中規定的部分書寫,類似於URL中的HTTP
com.milkz.providers.mytest <------ 該部分為AndroidContentProvider的authorities。繼承自ContentProvider的
類的包的路徑。
messages <------ 訪問的資料
三、ContentProvider簡介
ContentProvider需要自定義一個Class去繼承(有的公司API可能會把ContentProvider改成一個abstract,此時就需要使用者靈活改變了),假設這個自定義的類名為myContentProvider,這個定義的類的作用就是為了向其他應用提供資訊的類。類似於給BroadCastReciver傳送廣播通知的系統廣播,myContentProvider就是向外散發一個資訊,然後對它感興趣的類會去獲取這個資訊。ContentProvider向外傳送的資訊主要通過URI來發送,將一些資訊封裝在URI中,傳送出去。
繼承於ContentProvider的類需要重寫(有的公司的API修改了Google原生程式碼,可能就是實現介面了) 【ContentProvider中的六個方法】
boolean onCreate()
和activity、service一樣,ContentProvider也需要一個onCreate()來對資料進行初始化,但是在該方法中,同樣不可進行大量的邏輯運算,防止造成執行緒阻塞。但是onCreate只會啟動一次。該方法會在ContentProvider建立的時候被呼叫,當其他應用第一次訪問時,ContentProvider會被建立並且會呼叫該方法。
public Uri insert(Uri uri,ContentValues values)
uri:訊息封裝的uri
values:該URI對應的值
用於向URI中插入訊息
public int delete (Uri uri,String selection,String[] selectionArgs)
刪除某條訊息
public int update(Uri uri,ContentValues values,String selection,Stringp[] selectionArgs)
更新訊息
public Cursor query(Uri uri,String[] projection ,String selectiion,String[] selectionArgs,String sortOrder)
類似於對資料庫的操作,使用遊標對資料進行一系列操作。通過獲取遊標來讀取URI中的內容
public String getType(Uri uri)
返回當前uri所代表的資料MIME型別。
字串以 vnd.android.cursor.dir/ 開頭: 該URI包含多條記錄
字串以 vnd.android.cursor.item/ 開頭: 該URI只包含一條記錄
四、ContentResolver
ContentProvider是傳送URI,對應的ContentResolver是用來接收資訊並進行處理的,相比之下,ContentResolver並不需要太多的操作,直接在Content中使用getContentResolver() 來獲取預設的ContentResolver物件。
該物件直接操作URI對應的ContentProvider中的方法,故它屬於單例模式。一個Android原始碼中有大量的COntentProvider和ContentResolver,而URI就是連線對應的Provider和Resolver的利器。
五、在Androidmanifest中配置
<provider
android:name=".myProvider" <----- 類的名字
android:authorities="com.milkz.mYprovider" <------ 類的包名
android:
android:exported="true" /> <----- 該ContentProvider是否可以被其他應用呼叫。
六、URI工具類
1)UriMatcher <----- 判斷該URI能否被當前的ContentProvider處理
void addURI(String authority,String path,int code)
向URI中新增內容,也可以理解為註冊URI,一個URI可以包含多個記錄
authority+path = URI
code : 標識碼
int match(Uri uri)
返回URI匹配的標識碼,如果找不到則返回-1
使用:
String s = content://com.milkz.providers.mytest/messages;
UriMatcher matcher = new uriMatcher(UriMatcher.NO_MATCH);
matcher.addURI(s,message,1);
int a = matcher.match(Uri.parce(s)); // a =1
matcher.addURI(s,message/#,1);//此處#代表任意的標識碼
int b = matcher.match(Uri.parce(s/1));//b = 1
2) ContentUris <----- 操作Uri字串的工具類
withAppendedld(URI uri,int id)
為uri加上id,即標識碼
parseId(URI uri)
從指定的uri中解析出id