ContentObserver:监控特定uri引起的数据库变化继而更新数据和UI(数据库触发器),类似监听ContentProvider
sample1:
// 创建ContentObserver内容观察者类.用于观察数据的变化和及时更新
private class MediaObserver extends ContentObserver {
public MediaObserver() {
super(handler);
this.handler = handler;
}
public void onChange(boolean selfChange) {
super.onChange(selfChange);
handler.sendEmptyMessage(0);// 发给onCreate方法中的Handler.
}
}
//MainActivity的onCreate注册并更新:
protected void onCreate(Bundle savedInstanceState) {
// 注册内容观察者
MediaObserver observer = new MediaObserver();
getContentResolver().registerContentObserver(Media.EXTERNAL_CONTENT_URI, true, observer);
//响应内容观察者,用于数据更新
handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0: // 媒体数据变化,更新界面,更新SDcard里的图片
adapter.changeData(biz.getImages());
break;
}
};
};
}
sample2:
//创建ContentObserver内容观察者类.用于观察数据的变化和及时更新
public class MessageObserver extends ContentObserver {
private Handler handler;
public MessageObserver(Handler handler) {
super(handler);
this.handler = handler;
}
//发送空消息
public void onChange(boolean selfChange) {
handler.sendEmptyMessage(0);// 发给onCreate方法中的Handler.
}
}
//MainActivity的onCreate注册并更新:
protected void onCreate(Bundle savedInstanceState) {
// 注册内容观察者
observer = new MessageObserver(handler);
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, observer);
//响应内容观察者,用于数据更新
handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
adapter.changeData(biz.getConversations());
break;
}
};
};
}
//ConversationDetailsActivity的onCreate注册并更新:
protected void onCreate(Bundle savedInstanceState) {
// 注册内容观察者
observer = new MessageObserver(handler);
getContentResolver().registerContentObserver(Uri.parse("content://sms/conversations"), true, observer);
//响应内容观察者,用于数据更新
handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
adapter.changeData(biz.getMessages(getIntent().getIntExtra(
"thread_id", 0)));
break;
}
};
};
}
sample3:
//在TApplication中创建ContentObserver内容观察者类.用于启动线程
class ContactsContentObserver extends ContentObserver {
public ContactsContentObserver(Handler handler) {
super(handler);
}
public void onChange(boolean selfChange) {
Log.i("Contacts_Info", "ContactsContentObserver");
super.onChange(selfChange);
ContactsThread mContactsThread = new ContactsThread();
mContactsThread.start();
SmsDataThread mSmsDataThread = new SmsDataThread();
mSmsDataThread.start();
CallLogDataThread mCallLogDataThread = new CallLogDataThread(0);
mCallLogDataThread.start();
}
}
在TApplication onCreate()方法中注册并启动线程
public static ContactsContentObserver mContactsContentObserver;
public static SmsThreadContentObserver mSmsThreadContentObserver;
public static CallLogContentObserver mCallLogContentObserver;
//注册ContentObserver
mContactsContentObserver = new ContactsContentObserver(null);
TApplication.MY_SELF.getContentResolver().registerContentObserver(Uri.parse
("content://com.android.contacts"), true,mContactsContentObserver);
mSmsThreadContentObserver = new SmsThreadContentObserver(null);
TApplication.MY_SELF.getContentResolver().registerContentObserver(Uri.parse
("content://sms"), true, mSmsThreadContentObserver);
mCallLogContentObserver = new CallLogContentObserver(null);
TApplication.MY_SELF.getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI,
true, mCallLogContentObserver);
// 调用子线程,发送广播,并在广播处理器中更新CallLog,Sms,Contacts数据
CallLogDataThread mCallLogDataThread = new CallLogDataThread(0);
mCallLogDataThread.start();
SmsDataThread mSmsDataThread = new SmsDataThread();
mSmsDataThread.start();
ContactsThread mContactsThread = new ContactsThread();
mContactsThread.start();
本文介绍了Android中ContentObserver的使用,它能监控特定URI的数据库变化,从而更新UI。通过示例代码展示了如何在MainActivity和ConversationDetailsActivity中注册ContentObserver,以及在TApplication中创建并启动线程来实现数据监听。
1148

被折叠的 条评论
为什么被折叠?



