Android中ContentObserver與Settings的全域性資料監聽整理
一.內容觀察者ContentObserver
ContentObserver——內容觀察者,目的是觀察(捕捉)特定Uri引起的資料庫的變化,繼而做一些相應的處理,它類似於
資料庫技術中的觸發器(Trigger),當ContentObserver所觀察的Uri發生變化時,便會觸發它。觸發器分為表觸發器、行觸發器,
相應地ContentObserver也分為“表“ContentObserver、“行”ContentObserver,當然這是與它所監聽的Uri MIME Type有關的。
二.ContentObserver的註冊與取消
(1)註冊
註冊方法有三個引數,第一個引數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);