ContentObserver 内容观察者作用及特点

本文详细介绍了ContentObserver的使用方法,包括如何定义Uri、创建ContentObserver实例、注册与注销观察者等关键步骤。并通过一个监听短信内容变化的例子展示了具体的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

eg:

1、定义Uri

public static Uri KEY_BROWSER_URI = Uri.parse("content://com.android.browser.provider.search_engine/search_engine");

2、new 一个ContentObserver

    private ContentObserver mBrowserObserver = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange, Uri uri) {
            if (KEY_BROWSER_URI.equals(uri)) {
                isBrowserSogouSearch = CommonUtils.isBrowserSogouSearch();
            }
        }
    };

3、监听

ContentResolver resolver = IMEContext.getContext().getContentResolver();
resolver.registerContentObserver(KEY_BROWSER_URI, true, mBrowserObserver);

 

 

4、取消监听

        ContentResolver resolver = IMEContext.getContext().getContentResolver();
        resolver.unregisterContentObserver(mBrowserObserver);

 

ContentObserver 目的是观察(捕捉)特定 Uri 引起的数据库的变化, 继而做一些相应的处理。它类似于数据库技术中的触发器(Trigger),当 ContentObserver 所观察的 Uri 发生变化时,便会 触 发 它 。 触 发 器 分 为 表 触 发 器 、 行 触 发 器 , 相 应 地 ContentObserver 也 分 为 “ 表“ContentObserver、“行”ContentObserver,当然这是与它所监听的 Uri MIME Type 有关的。

注册 ContentObserver 方法

public final void registerContentObserver(Uri uri, boolean notifyForDescendents,
ContentObserver observer)

功能:为指定的 Uri 注册一个 ContentObserver 派生类实例,当给定的 Uri 发生改变时,回调该实例对象去处理。 

参数: uri 表示需要观察的 Uri 
notifyForDescendents为false表示精确匹配,即只匹配该Uri。为true表示可以同时匹配其派生的 Uri。

取消注册 ContentObserver 方法

public final void unregisterContentObserver(ContentObserver observer) 
功能:取消对给定 Uri 的观察 
参数: observer ContentObserver 的派生类实例

ContentObserver 类介绍

构造方法 ContentObserver(Handler h) 
void onChange(boolean selfChange) 功能:当观察到的 Uri 发生变化时,回调该方法去处理。所有 ContentObserver 的派生类都需要重载该方法去处理逻辑。

观察特定 Uri 的步骤如下

1、创建我们特定的 ContentObserver 派生类,必须重载父类构造方法,必须重载 onChange()方法去处理回调后的功能实现 
2 、 利 用 context.getContentResolover() 获 ContentResolover 对 象 , 接 着 调 用registerContentObserver()方法去注册内容观察者 
3、 在不需要时,需要手动的调用 unregisterContentObserver()去取消注册。

例子:监听短信内容变化

public class Day0108_contentobserverActivity extends Activity{
    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                case 100:
                    String body = (String) msg.obj;
                    TextView tv = (TextView) findViewById(R.id.tv);
                    tv.setText(body);
                    break;
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ContentResolver cr = getContentResolver();
        ContentObserver smsObserver = new
                SmsContentObserver(this, handler);
        //第二个参数,true 表示观察所有有关短信的
        cr.registerContentObserver(Uri.parse("content://sms"),
                true, smsObserver);
        //content://sms/inbox //收件箱
        //content://sms/sent //已发送
        //content://sms/draft //草稿箱
        //content://sms/outbox //发件箱
        //content://sms/failed //失败短信
        //content://sms/queued //代发队列
    }
}

//SmsContentObserver 代码如下:
public class SmsContentObserver extends ContentObserver {
    private Handler handler;
    private Context context;

    public SmsContentObserver(Context context, Handler
            handler) {
        super(handler);
        this.handler = handler;
        this.context = context;
    }

    @Override
    public void onChange(boolean selfChange) {
        ContentResolver cr = context.getContentResolver();
        Cursor c = cr.query(Uri.parse("content://sms/inbox"),
                null, "0", null, "date desc");
        StringBuilder sb = new StringBuilder();
        while (c.moveToNext()) {
            //发件人手机号码
            String sendNumber = c.getString(c.getColumnIndex("address"));
            //信息内容
            String body = c.getString(c.getColumnIndex("body"));
            //readType 表示是否已经读
            int hasRead = c.getInt(c.getColumnIndex("read"));
            if (hasRead == 0) {//表示短信未读
                System.out.println("短信未读" + sendNumber);
            }
            sb.append(sendNumber + ":" + body + "\n");
        }
        handler.obtainMessage(100, sb.toString()).sendToTarget();
    }
}

  

 

参考:https://blog.youkuaiyun.com/xiaopihair123/article/details/53149776

转载于:https://www.cnblogs.com/longjunhao/p/8926858.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值