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.csdn.net/xiaopihair123/article/details/53149776

ContentObserver 内容观察者作用及特点的更多相关文章

  1. android ContentObserver内容观察者基本使用

    package com.example.observertest; import android.content.ContentResolver; import android.database.Co ...

  2. Android -- ContentObserver 内容观察者

    1. 实现原理图 2. 示例代码 (暂时有个问题,短信观察者 收到一条短信时 onchange方法会执行两次, 解决方法为:每次监听到变化的时候就去取最新短信的id,跟上次取的比较,如果一样的就不做处 ...

  3. Android中内容观察者的使用---- ContentObserver类详解 (转)

    前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Conten ...

  4. 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)

    1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...

  5. 内容观察者 ContentObserver 监听短信、通话记录数据库 挂断来电

    Activity public class MainActivity extends ListActivity {     private TextView tv_info;     private  ...

  6. Android 之内容提供者 内容解析者 内容观察者

    contentProvider:ContentProvider在Android中的作用是对外提供数据,除了可以为所在应用提供数据外,还可以共享数据给其他应用,这是Android中解决应用之间数据共享的 ...

  7. Android 利用内容观察者实现短信窃听

    <Android 内容观察者的原理>中介绍了内容观察者的一些基本原理,并做了简单的实战,本文接着进一步做一个小项目实战 package com.wuyudong.smslistener; ...

  8. Android 内容观察者的原理

    拦截短信,比如当发短信的时候,就把短信读取出来,当系统的短信发生变化的时候,大叫一声,把数据发送到公共的消息邮箱里面,我们的应用通过内容观察者观察公共的消息邮箱 获取ContentResolver对象 ...

  9. Android内容观察者

    内容观察者是做什么的? 内容观察者主要用来观察数据库是否被操作了. 以查询数据库为例: 首先注册一个内容观察者(App1): //false 观察的Uri必须是一个确切的Uri 如果是true,只需要 ...

随机推荐

  1. Java安全之挖掘回显链

    Java安全之挖掘回显链 0x00 前言 前文中叙述反序列化回显只是为了拿到Request和Response对象.在这里说的的回显链其实就是通过一连串反射代码获取到该Request对象. 在此之前想吹 ...

  2. jQuery获取标签信息

    <!DOCTYPE html><html><head>    <meta charset="utf-8"/>    <titl ...

  3. explicit 关键字 禁止隐式转换

    explicit可以抑制内置类型隐式转换,所以在类的构造函数中,使用explicit关键字,防止不必要的隐式转换

  4. 7、linux防火墙的使用(iptables)

    7.1.说明: CentOS 7 系统默认的防火墙是 Filewalld.不过,现在应该还有很多用户习惯使用 iptables.本文以 CentOS 7 为例, 说明在 CentOS 7 中如何安装并 ...

  5. Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?

    大家好,我是冰河~~ 停更了很久的[Spring注解系列]专题,终于重新更新了,我们还是接着之前的文章继续往下更新.在<[Spring注解驱动开发]二狗子让我给他讲讲@EnableAspectJ ...

  6. 资源:Maven仓库地址路径

    Maven下载路径 https://archive.apache.org/dist/maven/maven-3/ 查找需要引入的包路径时,可以在maven仓库进行查找 maven仓库地址:https: ...

  7. pdfkit html转pdf

    pdfkit的通用option选项 参考:https://cloud.tencent.com/developer/ask/202116https://www.cnblogs.com/taceywong ...

  8. 第12次抽考(GUI)

    1. package week4; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextFiel ...

  9. java基础---设计模式(1)

    出处:https://blog.csdn.net/zhangerqing/article/details/8194653 java的设计模式分为三大类 创建型模式: 工厂方法模式.抽象工厂模式.单例模 ...

  10. P4827「国家集训队」 Crash 的文明世界

    「国家集训队」 Crash 的文明世界 提供一种不需要脑子的方法. 其实是看洛谷讨论版看出来的( (但是全网也就这一篇这个方法的题解了) 首先这是一个关于树上路径的问题,我们可以无脑上点分治. 考虑当 ...