1、ContentObserver——內容觀察者
目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理,ContentObserver是一個抽象類
類圖:
監聽URI變化
private static final class Transport extends IContentObserver.Stub {
private ContentObserver mContentObserver;
public Transport(ContentObserver contentObserver) {
mContentObserver = contentObserver;
}
@Override
public void onChange(boolean selfChange, Uri uri, int userId) {
ContentObserver contentObserver = mContentObserver;
if (contentObserver != null) {
contentObserver.dispatchChange(selfChange, uri, userId);
}
}
public void releaseContentObserver() {
mContentObserver = null;
}
}
dispatchChange處理:
private void dispatchChange(boolean selfChange, Uri uri, int userId) {
if (mHandler == null) {
onChange(selfChange, uri, userId);
} else {
mHandler.post(new NotificationRunnable(selfChange, uri, userId));
}
}
2、實際觀察者--子類(觀察Settings.Global.BLUETOOTH_DISABLED_PROFILES的變化)
public class ProfileObserver extends ContentObserver {
private Context mContext;
private AdapterService mService;
private AdapterStateObserver mStateObserver;
public ProfileObserver(Context context, AdapterService service, Handler handler) {
super(handler);
mContext = context;
mService = service;
mStateObserver = new AdapterStateObserver(this);
}
public void start() {
//註冊內容觀察者
mContext.getContentResolver()
.registerContentObserver(
Settings.Global.getUriFor(Settings.Global.BLUETOOTH_DISABLED_PROFILES),
false, this);
}
private void onBluetoothOff() {
mContext.unregisterReceiver(mStateObserver);
Config.init(mContext);
mService.enable();
}
//取消註冊
public void stop() {
mContext.getContentResolver().unregisterContentObserver(this);
}
@Override
//內容變化回調
public void onChange(boolean selfChange) {
if (mService.isEnabled()) {
mContext.registerReceiver(mStateObserver,
new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
mService.disable();
}
}