1. 程式人生 > 其它 >Android中ContentObserver與Settings的全域性資料監聽整理

Android中ContentObserver與Settings的全域性資料監聽整理

技術標籤:android開發android

一.內容觀察者ContentObserver

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

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

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

二.ContentObserver的註冊與取消

(1)註冊

public final voidregisterContentObserver(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的時候,當urigcc://com.http.ok/factory/children發生變化的時候是監聽不到的,當為true的時候則可以同時監聽到gcc://com.http.ok/factory/children的變化。

第三個引數observer :ContentObserver的派生類例項

(2)取消註冊public final voidunregisterContentObserver(ContentObserverobserver);

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

三.ContentObserver的構造與常用方法

構造方法public voidContentObserver(Handlerhandler)

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

       引數:Handler物件。可以是主執行緒Handler(這時候可以更新UI 了),也可以是任何Handler物件。

常用方法

voidonChange(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);