Android中ContentObserver与Settings的全局数据监听整理

一.内容观察者ContentObserver

          ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于

  数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,

  相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。

二.ContentObserver的注册与取消

(1)注册 public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer);

         注册方法有三个参数,第一个参数uri:需要观察的uri,

                                            第二个参数notifyForDescendents:Boolean类型的参数,当为false的时候代表着精确监听,只监听这一条uri的。

                                            当为true的时候代表着可以同时监听其派生的uri。例:

                                            1.gcc://com.http.ok/factory

                                            2.gcc://com.http.ok/factory/children

                                          当为false的时候,当uri gcc://com.http.ok/factory/children发生变化的时候是监听不到的,当为true的时候则可以同时监听到gcc://com.http.ok/factory/children的变化。

                                          第三个参数observer :ContentObserver的派生类实例

(2)取消注册 public final void  unregisterContentObserver(ContentObserver observer);

         observer :所需要取消的ContentObserver的派生类实例

三.ContentObserver的构造与常用方法

构造方法 public void ContentObserver(Handler handler)  

                       说明:所有   ContentObserver的派生类都需要调用该构造方法

          参数:Handler对象。可以是主线程Handler(这时候可以更新UI 了),也可以是任何Handler对象。

 常用方法

   void onChange(boolean selfChange)

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

       参数:selfChange 回调后,其值一般为false,该参数意义不大(我也不懂,理解方法最重要)。

四.settings.system

     settings.system为系统数据库,里面存放的数据大多为系统的一些配置数据,包括还有一些应用存放的其他数据信息。

用Settings来保存数据简单易用。

    通常我是想要查看settings.system的系统数据库,一般会结合上面的ContentObserver一起使用。

    从system.setting获得变量数据库的方法就是getUriFor方法, Settings.System.getUriFor(”“);

   写入系统数据库的方法:Settings.System.putInt(getContentResolver(),"设置的key值",1);

   可以写入多种格式,此方法在Android 6.0 以下是可以直接在清单文件中声明权限使用,但6.0以上权限不论是在清单文件还是动态权限请求都不可以,

必须需要系统级权限,一般高版本会在源码开发时才会使用。

五.结合使用

private ContentObserver mAnalogClockObserver = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
            //当监听的数据库uri发生变动时会触发
           ......
           //也可以将发生变动的值取出,getInt(),getString() ......
           Settings.System.getInt(activity.getContentResolver(),"getUriFor()中监听的uri");
        }

    };

注册:

mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.NANLOG_CLOCK_STYLE),
                false, mAnalogClockObserver);

在app结束或不在需要监听时需要取消注册:

mContext.getContentResolver().unregisterContentObserver(mAnalogClockObserver);

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值