概述
最近在寫項目,有個關(guān)于插拔耳機的監(jiān)聽,看到有個ContentObserver類可以監(jiān)聽數(shù)據(jù)庫
說實話,之前沒有使用過這個類,今天使用了一下,還挺好用的,當插入刪除數(shù)據(jù)的時候就會主動回調(diào)方法回來,我覺得很方便,而且比廣播的發(fā)送的要快
ContentObserver——內(nèi)容觀察者,目的是觀察(捕捉)特定Uri引起的數(shù)據(jù)庫的變化,繼而做一些相應(yīng)的處理,感覺它類似于數(shù)據(jù)庫技術(shù)中的觸發(fā)器(Trigger),當ContentObserver所觀察的Uri發(fā)生變化時,便會觸發(fā)它。觸發(fā)器分為表觸發(fā)器、行觸發(fā)器,相應(yīng)地ContentObserver也分為“表“ContentObserver、“行”ContentObserver,當然這是與它所監(jiān)聽的Uri MIME Type有關(guān)的。
ContentObserver目前只能是監(jiān)聽通過使用Provider的數(shù)據(jù)庫,直接使用文件的uri是不成功的
事例
下面監(jiān)聽數(shù)據(jù)庫的事例
public class pzSettingContentObserver extends ContentObserver {
private String TAG=this.getClass().getSimpleName();
private Context context;
/**
* Creates a content observer.
*
* @param handler The handler to run {@link #onChange} on, or null if none.
*/
public pzSettingContentObserver(Context context,Handler handler) {
super(handler);
this.context = context;
registerContentObservers();
}
//注冊觀察者
private void registerContentObservers() {
Uri uri=Uri.parse("");
context.getContentResolver().registerContentObserver(PhoneSettings.CONTENT_URI, true,this);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.i(TAG,"selfChange 1"+selfChange);
}
@Override
public void onChange(boolean selfChange, @Nullable Uri uri) {
super.onChange(selfChange, uri);
Log.i(TAG,"selfChange 2"+uri.toString());
}
@Override
public void onChange(boolean selfChange, @Nullable Uri uri, int flags) {
super.onChange(selfChange, uri, flags);
Log.i(TAG,"selfChange 3"+uri.toString()+",flags="+flags);
}
@Override
public void onChange(boolean selfChange, @NonNull Collection<Uri> uris, int flags) {
super.onChange(selfChange, uris, flags);
for (Uri uri : uris) {
Log.i(TAG,"selfChange 4"+uri.toString()+",flags="+flags);
}
}
}
//解除注冊觀察者
public void unregisterContentObservers(){
context.getContentResolver().unregisterContentObserver(this);
}
輸出的日志如下
2021-06-30 20:14:55.957 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:55.958 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/27
2021-06-30 20:14:55.958 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/27,flags=0
2021-06-30 20:14:55.985 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:55.985 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/28
2021-06-30 20:14:55.985 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/28,flags=0
2021-06-30 20:14:56.012 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:56.012 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/29
2021-06-30 20:14:56.012 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/29,flags=0
2021-06-30 20:14:56.037 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:56.038 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/30
2021-06-30 20:14:56.038 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/30,flags=0
可以看到當數(shù)據(jù)發(fā)生改變,就會調(diào)用到ContentObserver的onChange方法
從onChange方法中可以獲取content://操作的是哪個數(shù)據(jù)庫/哪個表/哪行
api
構(gòu)造函數(shù)
/**
* Creates a content observer.
*
* @param handler The handler to run {@link #onChange} on, or null if none.
*/
public ContentObserver(Handler handler) {
mHandler = handler;
}
這個api只能觀察通過使用contentProvider進行的數(shù)據(jù)庫監(jiān)聽,如果是本地直接打開的數(shù)據(jù)庫,我這嘗試是還沒有成功監(jiān)聽,要是有能監(jiān)聽到本地直接打開數(shù)據(jù)庫的方法, 歡迎大家留言
