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