Android中ContentObserver與Settings的全局數據監聽整理

一.內容觀察者ContentObserver

          ContentObserver——內容觀察者,目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理,它類似於

  數據庫技術中的觸發器(Trigger),當ContentObserver所觀察的Uri發生變化時,便會觸發它。觸發器分爲表觸發器、行觸發器,

  相應地ContentObserver也分爲“表“ContentObserver、“行”ContentObserver,當然這是與它所監聽的Uri MIME Type有關的。

二.ContentObserver的註冊與取消

(1)註冊 public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer);

         註冊方法有三個參數,第一個參數uri:需要觀察的uri,

                                            第二個參數notifyForDescendents:Boolean類型的參數,當爲false的時候代表着精確監聽,只監聽這一條uri的。

                                            當爲true的時候代表着可以同時監聽其派生的uri。例:

                                            1.gcc://com.http.ok/factory

                                            2.gcc://com.http.ok/factory/children

                                          當爲false的時候,當uri gcc://com.http.ok/factory/children發生變化的時候是監聽不到的,當爲true的時候則可以同時監聽到gcc://com.http.ok/factory/children的變化。

                                          第三個參數observer :ContentObserver的派生類實例

(2)取消註冊 public final void  unregisterContentObserver(ContentObserver observer);

         observer :所需要取消的ContentObserver的派生類實例

三.ContentObserver的構造與常用方法

構造方法 public void ContentObserver(Handler handler)  

                       說明:所有   ContentObserver的派生類都需要調用該構造方法

          參數:Handler對象。可以是主線程Handler(這時候可以更新UI 了),也可以是任何Handler對象。

 常用方法

   void onChange(boolean selfChange)

       功能:當觀察到的Uri發生變化時,回調該方法去處理。所有ContentObserver的派生類都需要重載該方法去處理邏輯。

       參數:selfChange 回調後,其值一般爲false,該參數意義不大(我也不懂,理解方法最重要)。

四.settings.system

     settings.system爲系統數據庫,裏面存放的數據大多爲系統的一些配置數據,包括還有一些應用存放的其他數據信息。

用Settings來保存數據簡單易用。

    通常我是想要查看settings.system的系統數據庫,一般會結合上面的ContentObserver一起使用。

    從system.setting獲得變量數據庫的方法就是getUriFor方法, Settings.System.getUriFor(”“);

   寫入系統數據庫的方法:Settings.System.putInt(getContentResolver(),"設置的key值",1);

   可以寫入多種格式,此方法在Android 6.0 以下是可以直接在清單文件中聲明權限使用,但6.0以上權限不論是在清單文件還是動態權限請求都不可以,

必須需要系統級權限,一般高版本會在源碼開發時纔會使用。

五.結合使用

private ContentObserver mAnalogClockObserver = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
            //當監聽的數據庫uri發生變動時會觸發
           ......
           //也可以將發生變動的值取出,getInt(),getString() ......
           Settings.System.getInt(activity.getContentResolver(),"getUriFor()中監聽的uri");
        }

    };

註冊:

mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.NANLOG_CLOCK_STYLE),
                false, mAnalogClockObserver);

在app結束或不在需要監聽時需要取消註冊:

mContext.getContentResolver().unregisterContentObserver(mAnalogClockObserver);

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章