android 數(shù)據(jù)庫監(jiān)聽 ContentObserver

概述

最近在寫項目,有個關(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ù)庫的方法, 歡迎大家留言

api方法.png

android開發(fā)者網(wǎng)站api地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容