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,只需要 ...
随机推荐
- 10、pfile和spfile文件详解
10.1.介绍: 1.Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件.它们是在数据库实例启动时候加载的, 决定了数据库的物理结构.内存.数据库的限制及系统大量的默认值.数据库 ...
- ROS2学习之旅(1)——初识ROS2
本系列用来记录ROS2的学习过程,有错误或者不合理的地方请大家指正.由于博主具有ROS1的学习经历,会添加一些与ROS1的一些对比,当然这对于ROS2本身的学习内容没有丝毫影响,欢迎大家积极与我在评论 ...
- CentOS6.5 mini安装到VirtualBox虚拟机中
下载Oracle VM VirtualBox 下载下来安装 下载镜像 http://archive.kernel.org/centos-vault/6.5/isos/i386/CentOS-6.5-i ...
- The Different of Python 2.x and 3.x
为了不给Python3.0带入过多的累赘,Python 3.x没有考虑向下兼容 1,print 函数 print语句没有了,取而代之的是print()函数. Python2.7 print " ...
- 12 shell case in语句
Shell也支持两种分支结构(选择结构),分别是 if else 语句和 case in 语句.当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了. if else 语句与ca ...
- CG-CTF single
一.拖入ida,先静态分析一下 发现有三个函数,点击进去看看 a1为0时,当a2[i]为0时,将自身的值赋值到该位置,a1为0时,就不需要动. 这三个函数都是在暗示这东西是个数独,每行每列,都有1到9 ...
- Linux | 通配符 & 转义符
通配符 我们在查看文件的时候,可能会出现只记得开头几个字母的情况,并且相似名称的文件还非常多的情况.还有小编想要删除一些开头一样的文件,这种情况下都可以使用通配符号: # 查找vcs文件 ls /de ...
- vue3 script setup 定稿
vue script setup 已经官宣定稿.本文主要翻译了来自 0040-script-setup 的内容. 摘要 在单文件组件(SFC)中引入一个新的 <script> 类型 set ...
- Python单元测试框架unittest之单用例管理(二)
概述 利用python进行测试时,测试用例的加载方式有2种: 一种是通过unittest.main()来启动所需测试的测试模块,上篇文章就是使用的这种方式: 一种是添加到testsuite集合中再加载 ...
- python 16篇 多线程和多进程
1.概念 线程.进程 进程 一个程序,它是一组资源的集合 一个进程里面默认是有一个线程的,主线程 多进程是可以利用多核cpu的线程 最小的执行单位 线程和线程之间是互相独立的 主线程等待子线程执行结束 ...