Android ContentObserver使用

本文介绍了Android中ContentObserver的使用,它能监控特定URI的数据库变化,从而更新UI。通过示例代码展示了如何在MainActivity和ConversationDetailsActivity中注册ContentObserver,以及在TApplication中创建并启动线程来实现数据监听。

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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值