ContentObserver 内容观察者作用及特点
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 内容观察者作用及特点的更多相关文章
- android ContentObserver内容观察者基本使用
package com.example.observertest; import android.content.ContentResolver; import android.database.Co ...
- Android -- ContentObserver 内容观察者
1. 实现原理图 2. 示例代码 (暂时有个问题,短信观察者 收到一条短信时 onchange方法会执行两次, 解决方法为:每次监听到变化的时候就去取最新短信的id,跟上次取的比较,如果一样的就不做处 ...
- Android中内容观察者的使用---- ContentObserver类详解 (转)
前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Conten ...
- 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)
1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...
- 内容观察者 ContentObserver 监听短信、通话记录数据库 挂断来电
Activity public class MainActivity extends ListActivity { private TextView tv_info; private ...
- Android 之内容提供者 内容解析者 内容观察者
contentProvider:ContentProvider在Android中的作用是对外提供数据,除了可以为所在应用提供数据外,还可以共享数据给其他应用,这是Android中解决应用之间数据共享的 ...
- Android 利用内容观察者实现短信窃听
<Android 内容观察者的原理>中介绍了内容观察者的一些基本原理,并做了简单的实战,本文接着进一步做一个小项目实战 package com.wuyudong.smslistener; ...
- Android 内容观察者的原理
拦截短信,比如当发短信的时候,就把短信读取出来,当系统的短信发生变化的时候,大叫一声,把数据发送到公共的消息邮箱里面,我们的应用通过内容观察者观察公共的消息邮箱 获取ContentResolver对象 ...
- Android内容观察者
内容观察者是做什么的? 内容观察者主要用来观察数据库是否被操作了. 以查询数据库为例: 首先注册一个内容观察者(App1): //false 观察的Uri必须是一个确切的Uri 如果是true,只需要 ...
随机推荐
- 技术实践:教你用Python搭建gRPC服务
摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...
- .NET Worker Service 部署到 Linux 作为 Systemd Service 运行
上一篇文章我们了解了如何将.NET Worker Service 作为 Windows 服务运行,今天我接着介绍一下如何将 Worker Service 部署到 Linux 上,并作为 Systemd ...
- 解放生产力,自动化生成vue组件文档
一.现状 Vue框架在前端开发中应用广泛,当一个多人开发的Vue项目经过长期维护之后往往会沉淀出很多的公共组件,这个时候经常会出现一个人 开发了一个组件而其他维护者或新接手的人却不知道这个组件是做什么 ...
- 『无为则无心』Python序列 — 19、Python列表的其他操作(切片和遍历)
目录 1.通过切片对列表的操作 (1)通过切片对列表进行修改 (2)通过切片对列表进行删除 (3)注意 2.列表的循环遍历 (1)while循环遍历 (2)for循环遍历 3.列表嵌套 4.综合示例 ...
- 10、修改windows编码集
10.1.查看Windows的字符集编码: 1.方法一: (1) 同时按住"windows"徽标键和"r"键,在弹出的"运行"框中输入&qu ...
- 使用kubeadm进行k8s集群升级
一.目标 操作系统:CentOS Linux release 7.6.1810 (Core) 安装软件: docker:18.06.3-ce 从v1.15.5升级到v1.16.15 当前版本: [ro ...
- SpringBoot:SpringCloud与SpringBoot兼容版本参(其它组件兼容情况)
SpringCloud --- Springboot 版本兼容 SpringCloud SpringBoot Edgware.SR5 >=1.5.0.RELEASE and <=1.5.2 ...
- pdfkit html转pdf
pdfkit的通用option选项 参考:https://cloud.tencent.com/developer/ask/202116https://www.cnblogs.com/taceywong ...
- FirstDay
昨天心血来潮,想着注册一博客,没想到今天再登时,审阅就通过了,多少有点庆辛.从今天起,我也算是有博客的人了! 为什么选博客园开通?好多IT论坛里都允许有博文,CSDN感觉过于高大上,其他系列论坛大多内 ...
- java二叉树的遍历(1)
树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...