ContentProvider是Android中提供的專門用于不同應(yīng)用間進行數(shù)據(jù)共享的方式,從這里看他天生就適合進程間通信鹉究。ContentProvider底層也是通過Binder實現(xiàn)進程間通信,不過使用起來要比AIDL要簡單,因為系統(tǒng)已經(jīng)為我們進行了封裝,我們不需要考慮到底層關(guān)系就可以實現(xiàn)IPC赌结。
ContentProvider使用:
首先先創(chuàng)建一個自定義的ContentProvider,如BookProvider繼承ContentProvider,其中有6個方法需要重寫onCreate(),undate(),delete(),query(),insert(),getType()扩淀。其中onCreate()是代表ContentProvider的創(chuàng)建。getType(Uri uri)需要傳入一個Uri,返回Uri所對應(yīng)的MIME類型博脑。undate(),delete(),query(),insert(),這個四個方法都是對數(shù)據(jù)庫的操作方法增刪改查票罐。這六個方法中叉趣,除了onCreate()是運行在主線程中,其他的五個方法都是由外界回調(diào)并且運行到Binder線程池中该押。
ContentProvider主要是以表格形式來組織數(shù)據(jù)疗杉,并且可以包含多個表,對于每個表蚕礼,他們都具有行和列的層次性烟具,行對應(yīng)著一條記錄,列對應(yīng)的一個屬性奠蹬,和數(shù)據(jù)庫類似朝聋。同時他也支持文件數(shù)據(jù),如圖片囤躁,視頻等冀痕。文件數(shù)據(jù)和表格數(shù)據(jù)不同,因此處理這類數(shù)據(jù)是可以在ContentProvider中返回文件的句柄給外界從而讓文件訪問ContentProvider中的文件信息狸演。
BookProvider創(chuàng)建完成后言蛇,我們在去配置XML文件,其中android:authorities是ContentProvider的唯一標識宵距,通過這個我們可以訪問到ContentProvider腊尚,所以這個要是唯一的,建議在定義的時候加上包名满哪。如果需要跨進程還需要聲明“com.ryg.PROVIDER”權(quán)限婿斥。
注冊完成后劝篷,我們就可以訪問了,只是這里面沒有東西受扳。
現(xiàn)在我們添加一些數(shù)據(jù)携龟,需要一個數(shù)據(jù)庫管理兔跌,我們創(chuàng)建一個DpOpenHelper繼承SQLiteOpenHelper勘高,然后創(chuàng)建幾個常量:如數(shù)據(jù)庫名字:public static final String DB_NAME = "book_provider_db" 表名:public static final ?String BOOK_TABLE_NAME = "book" 創(chuàng)建表語句:public static final String CREATE_TABLE_BOOK = "create table " + BOOK_TABLE_NAME + "(_id INTEGER PRIMARY KEY ," + "name TEXT)" 然后再OnCreate() 執(zhí)行創(chuàng)表語言就可以了。
然后我們就可以通過ContentProvider對表中的數(shù)據(jù)進行增刪改查了坟桅。ContentProvider通過URI來區(qū)分外界要訪問的數(shù)據(jù)集合华望,所以我們要對特定的表定義特定的URI和URI_CODE,通過UriMatcher.addURI的方法將URI和URI_CODE關(guān)聯(lián)到一起如:對于這個book表格,
public static final String AUTHRITY = "com.example.book.provider";//這個是唯一標識和XML里面authrities一樣仅乓。
public static final Uri BOOK_CONTENT_URI = Uri.parse("content://" + AUTHRITY + "/book");//book表格的URI
public static fianl int BOOK_URI_CODE = 1;//book表格的code
private static final UriMatcher ?uriMatcher= new UriMatcher(UriMatcher.NO_MATCH);//創(chuàng)建UriMatcher
static{ uriMatcher.addURI(AUTHRITY,"book",BOOK_URI_CODE); //將URI和code關(guān)聯(lián)到一起赖舟。
}
然后將undate() insert() query() delete() 這幾個方法完善,通過這四個方法操作數(shù)據(jù)庫夸楣。不過要注意的是insert() delete() undate() 這三個方法會導致數(shù)據(jù)庫里面數(shù)據(jù)發(fā)生改變宾抓,我們需要通過ContentResolver的notifychange方法通知外界當前的ContentProvider已經(jīng)發(fā)生改變。