一.內容觀察者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);