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();
`ContentObserver` 观察变化不产生延时,通常有以下几种原因及情况: ### 系统资源充足 当系统资源充足时,系统能够及时调度并处理 `ContentObserver` 的通知。例如,设备处于空闲状态,CPU、内存等资源没有被大量占用,系统可以迅速响应数据库变化并通知 `ContentObserver`。在这种情况下,`ContentObserver` 几乎能立即收到变化通知,不会出现明显的延时。 ### 变化类型与优先级 某些关键的系统数据变化,系统会优先处理并及时通知 `ContentObserver`。以 Android ContentObserver 使用实现 GPRS 快捷开关为例,当调用反射去改变 GPRS 数据时,`MyMobileDataObserver` 的 `onChange` 方法会立刻响应,可在 `onChange` 方法中更新视图界面。这表明对于这种重要的系统状态变化,系统会确保 `ContentObserver` 能及时收到通知,避免出现延时[^2]。 ### 未触发延迟机制 Android 后台进程中 `ContentObserver` 存在延迟回调机制,目的是优化系统资源,避免后台应用频繁监听数据变化。若应用处于前台,或者变化频率未达到触发延迟机制的阈值,`ContentObserver` 可能会立即收到通知。例如,应用在前台运行时,对某个数据库表进行少量的数据插入操作,系统可能不会进行延迟处理,而是直接通知 `ContentObserver`。 ### 代码示例 以下是一个简单的 `ContentObserver` 示例,用于观察移动数据状态变化: ```java import android.content.ContentResolver; import android.content.ContentObserver; import android.net.Uri; import android.os.Handler; import android.provider.Settings; public class MyMobileDataObserver extends ContentObserver { public MyMobileDataObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); // 处理移动数据状态变化 } public static void registerObserver(ContentResolver contentResolver, Handler handler) { Uri uri = Settings.Secure.getUriFor("mobile_data"); MyMobileDataObserver observer = new MyMobileDataObserver(handler); contentResolver.registerContentObserver(uri, false, observer); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值