內容提供者簡介
內容提供者ContentProvider是Android系統四大組件之一,用於保存和檢索數據,是Android系統不同應用程序之間共享數據的接口。在Android系統中,應用程序之間是相互獨立的,分別運行在自己的進程中,相互之間沒有交換數據。如果應用程序之間需要共享數據,就需要用到ContentProvider了。
ContentProvider是不同應用程序之間進行數據交換的標準API,它以URI形式對外提供數據,允許其它應用操作本應用的數據。其它應用程序則使用ContentResolver,並根據ContentProvider提共的URI操作指定的數據。
創建內容提供者
創建一個內容提供者
第一步:寫一個類繼承ContentProvider這個抽象類,重寫它的方法,例如:UserProvider.java
onCreate()創建ContentProvider時調用
query():根據傳入的URI,查詢指定條件下的數據
delete():刪除
update():修改
insert():插入
第二步:在Android清單文件中註冊這個內容提供者
<provider
android:name=”cn.itcast.user.provider.UserProvider”
android:authorities=”cn.itcast.user.provider.itcastdb”
android:exported="true"
/>
name表示內容提供者的全路徑名
authorities表示其它應用程序訪問本應用的內容提供者的URI,注意這個URI在整個Android
系統中要唯一,初學者在這裏可以將URI理解爲口令。
exported=true表示自願暴露給第三方使用
URI簡介
ContentProvider這個抽象類中的方法,多數方法需要其它應用程序訪問者傳入一個URI參數。URI是由三部份組件,分別是:schema、authorities、path,其中schema和authorities必寫,schema固定爲content://
Uri.parse(String)方法是將一個字符串轉成URI對象,爲了解析URI,Android提供了一個UriMatcher這個輔助類來匹配URI,常用方法如下:
1——UriMatcher(int code):創建UriMatcher時調用,參數表示如果訪問者的路徑錯誤,返回的code值
2——addURI(String authority,String path,int code):添加一組匹配規則,如果訪問者的路徑正確,返回code
3——int match(Uri):匹配URI與addURI中的路徑是否相同,成功則返回addURI中的code值
訪問內容提供者
ContentResolver的基本用法
我們手機中的很多Android應用,都對外提供了ContentProvider接口,例如:短信,只要我們知道系統短信應用的URI,就可以使用ContentResolver對象來訪問系統短信應用了。
查詢系統所有短信的URI爲:content://sms
address:手機號
date:發送或接收短信的時間
body:發送或接收的內容
type:發送或接收的代碼,接收爲1號,發送是2號
如果要訪問系統短信應用的話,需要在Android清單文件中配置如下權限:
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
內容觀察者的使用
什麼是內容觀察者
當使用ContentProvider將數據共享出來之後,再使用ContentResolver查詢ContentProvider共享出來的數據,是一種很常見的操作。如果應用程序需要實時監聽ContentProvider共享的數據是否發生了變化,可以使用Android系統提供的內容觀察者ContentObserver來實現。
內容觀察者ContentObserver是用來觀察指定URI所代表的數據。當ContentObserver觀察到指定URI的數據發生變化時,就會觸發ContentObserver的onChange()方法,此時在onChange()方法中使用ContentResolver可以查詢到變化的最新數據。
ContentObserver內容觀察者常用的方法如下:
1——ContentObserver(Handler handler):構造方法,參數可以是主線程Handler(可更新UI)或任何Handler
2——onChange():當觀察到的URI代表的數據發生變化時,會觸發該方法
創建內容觀察者:
1——創建一個普通類繼承ContenObserver
2——重寫onChange()方法