Android組件content provider使用解析
一、基本概念
Android四大組件之一 content provider,它主要的作用是:實現(xiàn)各個應(yīng)用程序之間的(跨應(yīng)用)數(shù)據(jù)共享。
在這里涉及到進(jìn)程通信問題,自然在Android中使用的是binder來進(jìn)行,但是由于content provider提供的數(shù)據(jù)量一般都比較大不能夠直接進(jìn)行傳遞。
所以這里采用的是一種叫做 匿名共享內(nèi)存的方式進(jìn)行數(shù)據(jù)傳遞,在不同的進(jìn)程中只需要傳遞一個文件描述符就可以。
通過下圖對content provider有個比較直觀的了解:

ContentProvider提供了在應(yīng)用程序之前共享數(shù)據(jù)的一種機(jī)制。
1)存儲和獲取數(shù)據(jù)提供了統(tǒng)一的接口。
2)對數(shù)據(jù)進(jìn)行封裝,不用關(guān)心數(shù)據(jù)存儲的細(xì)節(jié)。
3)Android為常見的一些數(shù)據(jù)提供了默認(rèn)的ContentProvider(包括音頻、視頻、圖片和通訊錄等)。
二、content provider的定義
如果需要使用content provider首先需要在AndroidManifest中進(jìn)行申明
<provider android:authorities="list" //該provider的唯一ID
android:directBootAware=["true" | "false"]
android:enabled=["true" | "false"] // 能否被系統(tǒng)實例化
android:exported=["true" | "false"] //該provider能否被其他應(yīng)用使用
android:grantUriPermissions=["true" | "false"]
android:icon="drawable resource"
android:initOrder="integer"
android:label="string resource"
android:multiprocess=["true" | "false"]
android:name="string"
android:permission="string"
android:process="string"
android:readPermission="string" //讀權(quán)限
android:syncable=["true" | "false"]
android:writePermission="string" > //寫權(quán)限
. . .
</provider>
注意在provider的屬性中最重要的是 authorities,它是唯一能夠標(biāo)識一個provider,contentprovider通過URI中的地址來查找到對應(yīng)的provider,其中該URI就包含了需要尋找的provider中的authorities屬性值。
定義好的provider最后被打包編譯進(jìn)入到PackageManagerService中。
在Java代碼中定義一個provider時需要繼承其父類ContentProvider,并實現(xiàn)增刪查改方法。
public class XXXXProvider extends ContentProvider {
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
三、contentprovider的使用
在activity中如果想通過provider來實現(xiàn)增刪查改,首先需要獲取contentprovider,大致過程為在context中獲取contentResolver,然后通過contentResolver去ActivityManagerService中查詢對應(yīng)的provider,如果沒有則進(jìn)入PackageManagerService中查找:
1)首先每個context類都會內(nèi)部包含了一個ContentResolver的子對象ApplicationContentResolver。
2)通過調(diào)用ApplicationContentResolver的主要方法query來獲取CP的數(shù)據(jù)庫數(shù)據(jù)。
3)調(diào)用的過程首先會調(diào)用ContentResolver的核心方法acquireProvider()。而acquireProvider()方法是一個抽象方法,其實現(xiàn)是交由子類實現(xiàn)。
4)通過子類的acquireProvider()方法實現(xiàn)了解到主要的實現(xiàn)是交由ActivityThread類來完成。
5)ActivityThread類會做出一個判斷,如果本地保存一個需要獲取的CP對象實例,就會直接返回這個對象實例,如果沒有保存,則會訪問AMS對象去查找獲取一個對象的CP對象實例,當(dāng)找到這個對象實例后會保存到本地以便日后快速獲取。
6)如果在AMS里面沒有找到,就會繼續(xù)深入到PMS里去從全部的provider中查找。
7)獲取到CP對象實例后會通過層層返回,最后再調(diào)用該CP對象的query方法獲取相應(yīng)的數(shù)據(jù)。
首先在應(yīng)用的的manifest中需要進(jìn)行讀寫權(quán)限申明,這個申明的定義跟之前provider定義中讀寫所需權(quán)限屬性值是一樣的:
<use-permission android:name="android.permission.READ_SMS"/> <use-permission android:name="android.permission.WRITE_SMS"/>
在activity中獲取ContentResolver調(diào)用其中的操作方法時,需要傳入相對應(yīng)的參數(shù):
contentResolver.query(Uri uri, String[] projection,String selection, String[] selectionArgs,String orderBy);
uri:傳入對應(yīng)uri是為了查找到對應(yīng)的provider,跟provider在manifest中定義的authorities值是一樣
projection:選擇需要返回的對象屬性值,有時候不需要將對象的值全部返回。
selection/selectionArgs: 查詢條件
orderBy: 返回的對象排序方式
類似其他的delete、insert和update操作。最主要的是傳入正確的Uri才能找到對應(yīng)的provider。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android開發(fā)之ContentProvider的使用詳解
- Android中自定義ContentProvider實例
- 淺談Android Content Provider的使用
- 基于Android 監(jiān)聽ContentProvider 中數(shù)據(jù)變化的相關(guān)介紹
- 實例講解Android中ContentProvider組件的使用方法
- 基于Android ContentProvider的總結(jié)詳解
- Android中自定義ContentProvider實例
- Android應(yīng)用中使用ContentProvider掃描本地圖片并顯示
- 深入Understanding Android ContentProvider詳解
- Android內(nèi)容提供者ContentProvider用法實例分析
相關(guān)文章
android手機(jī)獲取gps和基站的經(jīng)緯度地址實現(xiàn)代碼
android手機(jī)如何獲取gps和基站的經(jīng)緯度地址,疑問,于是網(wǎng)上搜集整理一些,拿出來和大家分享下,希望可以幫助你們2012-12-12
Android如何獲取系統(tǒng)通知的開啟狀態(tài)詳解
這篇文章主要給大家介紹了關(guān)于Android如何獲取系統(tǒng)通知開啟狀態(tài)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起看看吧啊。2017-08-08
Android中獲取網(wǎng)頁表單中的數(shù)據(jù)實現(xiàn)思路及代碼
在Android中獲取網(wǎng)頁里表單中的數(shù)據(jù)具體實現(xiàn)代碼如下,感興趣的各位可以參考過下哈,希望對大家有所幫助2013-06-06
Android kotlin語言實現(xiàn)刪除文件的解決方案
這篇文章主要介紹了Android kotlin語言實現(xiàn)刪除文件的解決方案,在項目開發(fā)過程中,尤其是需要跨平臺協(xié)作的項目,那么刪除用戶指定的文件的這種操作就顯得尤為重要了,需要的朋友可以參考下2025-02-02
Android實現(xiàn)快遞單號查詢快遞狀態(tài)信息
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)快遞單號查詢快遞狀態(tài)信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05

