Android ContentObserver 使用

本文介绍了一个具体的ContentObserver使用案例,展示了如何通过继承ContentObserver并重写onChange方法来监听系统设置的变化。具体包括如何注册监听器及如何响应设置值的变动。

1.先看使用实例代码:    

class SettingsObserver extends ContentObserver {
        public SettingsObserver(Handler handler) {
            super(handler);
            ContentResolver resolver = mContext.getContentResolver();
            if ("1".equals(SystemProperties.get("ro.tyd_smart_wake_support"))) {
                resolver.registerContentObserver(Settings.System.getUriFor(
                                Settings.System.TYD_SCREEN_DISABLE_SMART_WAKE), false, this,
                        UserHandle.USER_ALL);
                resolver.registerContentObserver(Settings.System.getUriFor(
                                Settings.System.TYD_SCREEN_DISABLE_UP_SETTING), false, this,
                        UserHandle.USER_ALL);
            }

        }

        @Override
        public void onChange(boolean selfChange) {
        
        }
    }

用registerContentObserver注册要监听的值。

重写onChange函数,有注册是值改变的时候系统就会调用onChange

`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、付费专栏及课程。

余额充值