ContentObserver实现数据库的监听

工作中有时需要开启一个线程做大量的查询,来检测某个数据库值发送了变化,导致的开销很大,后来利用了ContentObserver完美的解决了该问题,这里做下总结。

(1)ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库中的触发器,当所察的Uri发生变化时,便会触发它。它的主要方法有:

   A,public final void  registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer),功能:为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。参数:uri,需要观察的Uri;notifyForDescendents,为false表示精确匹配,即只匹配该Uri,为true表示可以同时匹配其派生的Uri,一般为true;observer,ContentObserver的派生类实例。

   B,public final void  unregisterContentObserver(ContentObserver observer),功能:取消对给定Uri的观察

   C,public void ContentObserver(Handler handler),功能:所有ContentObserver的派生类都需要调用该构造方法。参数:handler,Handler对象。可以是主线程Handler(这时候可以更新UI 了),也可以是任何Handler对象。

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

(2)使用ContentObserver的前提是系统数据库中已经有这个变量,建立这个变量的方法是修改frameworks/base/core/java/android/provider/Settings.java,比如要添加属性“SILVAN_LIU”,则

public static final String SILVAN_LIU = “silvan_liu”;

public static final String[] SETTINGS_TO_BACKUP ={

~

+SILVAN_LIU

~

}

这样添加后,你就可以通过Settings.System.getInt(getContentResolver(), Settings.System.SILVAN_LIU,0) 和Settings.System.putInt(getContentResolver(), Settings.System.SILVAN_LIU,0)去得到和设定SILVAN_LIU的属性值。

(3)一个实例,用来监控当设置中的开关切换时,对应的服务要打开或者关闭(图标显示或隐藏)。

   需要导入的类:

import android.content.ContentResolver;

import android.database.ContentObserver;

全局变量:

ContentResolver cr = null;

在服务的onCreate中完成:

cr = mContext.getContentResolver();

cr.registerContentObserver(

Uri.parse(“content://settings/system/xxxx”), //监听的URI值对象

true,

m_xxxxyObserver); //ContentObserver实例,在外面定义

在服务类中完成ContentObserver实例的构造,以及完成onChange重载处理:

private ContentObserver m_xxxxObserver = new ContentObserver(new Handler()){

public void onChange(boolean selfChange){

updateSettingsValues();

}

};

private void updateSettingsValues() {

mIsxxxxOn= Settings.System.getInt(cr,”isxxxxEnabled”,0) == 1 ? true : false;

if(mIsxxxxyOn == true){

//开启服务,显示图标

}

else{

//关闭服务,隐藏图标

}

}

在服务的onDestroy函数中,必须反注册这个ContentObserver:

cr.unregisterContentObserver(m_xxxxObserver);

(3)总结:使用ContentObserver的情况主要有一下两者情况:A,需要频繁检测的数据库或者某个数据是否发生改变,如果使用线程去操作,很不经济而且很耗时 ;B,在用户不知晓的情况下对数据库做一些事件,比如:悄悄发送信息、拒绝接受短信黑名单等;

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 04:52:44

ContentObserver实现数据库的监听的相关文章

Android短信监听(二)——利用ContentObserver实现短信监听

MainActivity如下: package cc.testsmslistener; import cc.testsmslistener.SMSContentObserver.MessageListener; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; import android.app.Activity; /** *

节点2上crsd无法启动,数据库和监听无法自动启动,比如ocrconfig、ocrcheck以及srvct

CRSD进程在11g中的变化 在11.2中,CRSD进程不再是RAC中最关键的进程之一. 如果对10g RAC比较熟悉,应该清楚CRSD进程的重要性,Oracle在操作系统启动后,就是通过启动这个进程然后启动整个CLUSTER以及数据库的. 在11.2的RAC中,Oracle调整了ASM,使得OCR和VOT可以存储在ASM磁盘组中.ASM是CLUSTER所支持的一个组件,而CLUSTER启动所需的OCR和VOT却要放在ASM中,这其实要解决一个先有鸡还是先有蛋的问题.最终Oracle通过OHAS

linux下数据库实例监听开机自启动设置

linux下数据库实例监听开机自启动设置 2016/5/16 zhanky 脚本介绍 在开始之前,我们先介绍一下几个会用到的脚本. oratab oratab文件是在创建数据库实例时建立的,在安装时使用root用户执行root.sh脚本后得到.(如果忘记也可以直接手动创建.) 在$ORACLE_HOME/bin目录下的$ORACLE_HOME/bin/dbstart和$ORACLE_HOME/bin/dbshut需要调用/etc/oratab文件,如果不存在,dbstart和dbshut将失败,

配置Oracle数据库和监听随Linux系统自启动【转】

配置Oracle数据库和监听随Linux系统自启动 在某些情况下需要在Linux操作系统上提供一种无人值守的随机启动Oracle的功能,目的也许仅仅是为了帮助那些对Oracle细节非常不关心的朋友.当然,如果有可能,一定不要使用这种自动化的方法,因为有太多不确定的因素存在.正途还是一边手工启动数据库,一边监控alert日志,以便第一时间发现问题解决问题. Anyway,随Linux系统启动数据库还是有其存在价值的,下面通过这个小文儿给大家展示一下这个自动化过程. 1.确保“/etc/oratab

[数据库]服务器监听连接不上

标题 是大部分 都能百度出 解决方案的,但是 就是那么的不巧 百度出的任何方案都不能觉得问题.... 事情发生在上周五的晚上,魔都的天气冻死个人,事情也出现的让人心哇凉哇凉的..... 首先,部里的人 说我们没传数据过去,本来是抵着万般不情愿的心情的,结果肿是那么不近人意,还真是我们的数据库问题啊, TNS:无监听 第一想法:监听程序异常了? 查看了监听及相关配置三大文件,etc文件 都很乖的,很正常的 监听程序也启动着呢, 本地sqlplus也连接正常啊,怎么就jdbc连接不成功呢? 第二想法

TNS-12541,TNS-12560,TNS-00511,TNS-12542,TNS-12560,TNS-00512数据库启动监听报错

第 1章   数据库服务器监听错误 1.1.1数据库监听错误 1.1.1.1 问题及现象 服务器环境为ORACLE11G RAC环境,系统启动后,监听没起来. [[email protected] ~]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 29-JUN-2015 10:44:45 Copyright (c) 1991, 2011, Oracle.  All rights reserved. C

oracle数据库静态监听和动态监听 区别

oracle静态监听和动态监听 一.什么是注册? 注册就是将数据库作为一个服务注册到监听程序.客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名 就可以申请连接到数据库.这个服务名可能与实例名一样,也有可能不一样. 在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册 到监听器中:数据库服务器对应的实例和服务.) 相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对

数据库安全检查监听是重点,设置监听密码

Oracle 数据库监听的安全管理是比较容易忽略的一个问题,做一个测试禁用监听的本地验证功能,设置监听密码,数据库版本为11.2.0.4 1.默认配置listener.ora LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = roidb01)(PORT = 1521))))SID_LIST_LISTENER=(SID_LIST =(SID_DESC =(GLOBAL_DBNAME = orc

Android使用ContentObserver监听数据库变化(转自:http://www.blogjava.net/zhaojianhua/archive/2011/10/27/362204.html)

android 使用contentobserver监听数据库内容变化 android 使用contentobserver监听数据库内容变化 在 android中经常会用到改变数据库内容后再去使用数据库更新的内容,很多人会重新去query一遍,但是这样的问题就是程序会特别占内存,而且有可能 会搂关cursor而导致程序内存未释放等等.其实android内部提供了一种ContentObserver的东西来监听数据库内容的变化.ContentObserver 的构造函数需要一个参数Hanlder,因为