ContentObserver实现数据库的监听

来源:互联网 发布:novesta淘宝 编辑:程序博客网 时间:2024/06/15 20:56

工作中有时需要开启一个线程做大量的查询,来检测某个数据库值发送了变化,导致的开销很大,后来利用了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,在用户不知晓的情况下对数据库做一些事件,比如:悄悄发送信息、拒绝接受短信黑名单等;

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 融e借没有u盾怎么办 窗式空调声音大怎么办 瑞得卡过期了怎么办 对公账号转错了怎么办 中银e令丢了怎么办 中银e贷到期了怎么办 招行信用卡附属卡怎么办 华普超市购物卡怎么办 公司发超市购物卡怎么办 物美购物卡丢了怎么办 淘宝买肯德基电子券留错号码怎么办 京东e卡过期了怎么办 京东e卡绑定错了怎么办 手机换号京东账号绑的银行卡怎么办 京东金条激活失败怎么办 京东买的k3不能激活怎么办 优购手机光黑屏怎么办 优购手机忘记手势密码怎么办 消费卡过期了钱怎么办 超市卡过期了钱怎么办 宜家购物卡的钱怎么办 武商购物卡过期怎么办 丹尼斯卡过期了怎么办 联华ok卡过期了怎么办 汉购通过期了怎么办 天猫退货要检测报告怎么办 京东退货后发票怎么办 京东金融被盗刷怎么办 京东e卡丢了怎么办 京东e卡没有密码怎么办 同一个订单微信付款两次怎么办 京东购物卡掉了怎么办 京东购物卡丢了怎么办 京东快递丢了怎么办 京东e卡支付多了怎么办 京东帐号忘了怎么办 京东白条风控怎么办 我有个破袄…没有衣服怎么办办 轩辕传奇手游灵宠融合错了怎么办 各尧学生不能用怎么办? 山东一卡通商务卡丢了怎么办