ContentObserver——内容观察者,目的是观察特定Uri引起的数据库的变化

这个是官方的文档,将的也是比较少

一般使用分为四步,

1、创建内容观察者 ContentObserver
2、注册监听 registerContentObserver
3、刷新数据库改变  onChange
4、注销监听 unregisterContentObserver

下面写2个demo 监听手机的飞行模式,和手机的显示12小时制还是24小时制  对上面的步骤进行说明,可以看下我录制的一个gif图

下面直接上代码了 main 的代码

public class MainActivity extends AppCompatActivity {// 飞行模式的观察者private AirPlaneModeContentObserver airPlaneModeContentObserver;// 12or24小时的观察者private TimeContentObserver timeContentObserver;private TextView airPlaneText;private TextView timeText;@SuppressLint("HandlerLeak")private Handler mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case AirPlaneModeContentObserver.MSG_AIRPLANEMODE:int isAirPlaneModeOpen = (Integer) msg.obj;if (isAirPlaneModeOpen == 1) {airPlaneText.setText("已打开");} else {airPlaneText.setText("已关闭");}break;case TimeContentObserver.MSG_TIME_12_24:int is12Or24Hour = (Integer) msg.obj;if (is12Or24Hour == 12) {timeText.setText("12小时制度");} else {timeText.setText("24小时制度");}default:break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);airPlaneText = findViewById(R.id.mode);timeText = findViewById(R.id.time);// 创建观察者airPlaneModeContentObserver = new AirPlaneModeContentObserver(MainActivity.this, mHandler);timeContentObserver = new TimeContentObserver(MainActivity.this, mHandler);findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startAirPlaneModeRegister();}});findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startTimeRegister();}});}private void startTimeRegister() {Uri timeUri = Settings.System.getUriFor(Settings.System.TIME_12_24);Log.e("--------main", "timeUri=" + timeUri);ContentResolver contentResolver = getContentResolver();// 注册contentResolver.registerContentObserver(timeUri, false,timeContentObserver);}private void startAirPlaneModeRegister() {Uri airPlaneModeUri = Settings.System.getUriFor(Settings.System.AIRPLANE_MODE_ON);Log.e("--------main", "airPlaneModeUri=" + airPlaneModeUri);ContentResolver contentResolver = getContentResolver();contentResolver.registerContentObserver(airPlaneModeUri, false, airPlaneModeContentObserver);}@Overrideprotected void onDestroy() {super.onDestroy();getContentResolver().unregisterContentObserver(airPlaneModeContentObserver);getContentResolver().unregisterContentObserver(timeContentObserver);}
}

飞行模式的观察者代码

public class AirPlaneModeContentObserver extends ContentObserver {public static final int MSG_AIRPLANEMODE = 1;private Context mContext;private Handler mHandler;/*** Creates a content observer.** @param handler The handler to run {@link #onChange} on, or null if none.*/public AirPlaneModeContentObserver(Context context, Handler handler) {super(handler);mContext = context;mHandler = handler;}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);try {int isAirPlaneModeOpen = Settings.System.getInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON);// 飞行模式为返回值是1,不是飞行模式返回值是0Log.e("------onChange", " isAirPlaneModeOpen=" + isAirPlaneModeOpen);mHandler.obtainMessage(MSG_AIRPLANEMODE, isAirPlaneModeOpen).sendToTarget();} catch (Settings.SettingNotFoundException e) {e.printStackTrace();}}
}

12or24 小时制观察者

public class TimeContentObserver extends ContentObserver {public static final int MSG_TIME_12_24 = 2;private Context mContext;private Handler mHandler;/*** Creates a content observer.** @param handler The handler to run {@link #onChange} on, or null if none.*/public TimeContentObserver(Context context, Handler handler) {super(handler);mContext = context;mHandler = handler;}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);int is12Or24Hour = 0;try {is12Or24Hour = Settings.System.getInt(mContext.getContentResolver(),Settings.System.TIME_12_24);} catch (Settings.SettingNotFoundException e) {e.printStackTrace();}// 12小时制度会返回12 ,24小时制度会返回24 当然我们也可以使用Settings.System.getString()方法Log.e("------onChange", " is12Or24=" + is12Or24Hour);mHandler.obtainMessage(MSG_TIME_12_24, is12Or24Hour).sendToTarget();}
}

代码也是很简单,但是需要特别注意下,并不是我们写前端的注册了 ContentObserver 数据发生变化我们就能接受到的, 想表达的意思就是,假如现在你需要实现一个逻辑,监听接口变化,是显示界面的添加或者删除,

你需要去确保数据源那边发生变化的时候,调用了getContentResolver().notifyChange() 方法了,我们写ContentObserver才会接口到数据变化,否则我们写了ContentObserver onChange 里面也是没有数据返回的.

// 通知已注册的观察者行已更新并尝试同步更改网络
public void notifyChange(@NonNull Uri uri, @Nullable ContentObserver observer) {notifyChange(uri, observer, true /* sync to network */);}

demo 地址,点击跳转到git

Android 内容观察者 ContentObserver 类相关推荐

  1. Android内容观察者

    内容观察者是做什么的? 内容观察者主要用来观察数据库是否被操作了. 以查询数据库为例: 首先注册一个内容观察者(App1): 1 //false 观察的Uri必须是一个确切的Uri 如果是true,只 ...

  2. 简单步骤:Android studio 内容观察者 - 实现数据变化监测

    提示:本篇文章将会尽量保持精简,附加图文解释,焦躁是敲写代码最大的敌人,三连是最大的支持! 文章目录 前言 一.项目介绍 二.使用步骤 1.创建第一个程序 2.导入图片 3.放置界面控件 4.创建数据 ...

  3. Android 观察系统中短信内容的变化(内容观察者)

    //内容观察者(如果系统的短信发生了变化,比如刚获取一条短信,那么将触发onChange方法)ContentResolver contentResolver = getContentResolver( ...

  4. Android的内容观察者

    有个很常见的需求就是当有新的短信来的时候,把内容显示在界面上.这里就要用到内容观察者.就是让你的程序监视短信,如果他内容发生变化的时候,你去获取.而短信那边做的情况就 是,当他自己的数据变化时,他告诉 ...

  5. 2020-11-12(内容提供者,内容解析者,内容观察者)

    内容提供者实现步骤 a.写一个类继承ContentProvider 重写onCreat query delete insert getType b.在清单文件中声明对应的provider节点 auth ...

  6. 获取未接来电及新短信的小栗子(主要使用ContentObserver类)

    1.ContentObserver简单介绍:     ContentObserver--内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器( ...

  7. ContentObserver类的使用

    ContentObserver类的使用 application A提供了provider, application B可以使用. application on更新provider后, 要通知appli ...

  8. android无法实例化服务,Android:无法实例化类:没有空的构造函数

    请看下面,我得到一个无法实例化类:当试图运行我的"HomeFragmentListExpand"类时,LogCat中没有空的构造函数错误,即使我清楚地有一个空的构造函数那里.And ...

  9. Android常用的工具类

    2019独角兽企业重金招聘Python工程师标准>>> 最新最准确内容建议直接访问原文:Android常用的工具类 主要介绍总结的Android开发中常用的工具类,大部分同样适用于J ...

最新文章

  1. 刚刚,DeepMind被IJCAI授予杰出成就奖,因为他家把AlphaGo Zero做成了暖心的新垣结衣?
  2. unity3d 地面印花_unity怎么实现挖掘泥土?
  3. 被远程机器长时间无响应 (错误码:[308])_自动折叠式“Rollbot”为完全不受束缚的软机器人铺平了道路...
  4. 【实践案例】Databricks 数据洞察在美的暖通与楼宇的应用实践
  5. 操作系统之进程管理:13、吸烟者问题
  6. 软链接与硬链接的区别;描述通配符与正则表达式的区别
  7. 2015年上半年总结
  8. python互斥锁_python互斥锁
  9. Mac Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA
  10. linux中fish脚本,FISH:Linux 下的一个智能易用的 Shell
  11. 工具 - UI原型设计工具Pencil Project
  12. 美国博士后J1签证北京面签经过
  13. css横排文字光影效果_css3模糊发光文字动画特效
  14. 域名(DNS)原理及解析过程详解
  15. C++跨平台技术 - 线程Thread
  16. 支付宝小程序动态绑定样式
  17. 古琴怎么学,初学者应该这么练(一)
  18. android sqlite加密数据库,Android Sqlite数据库加密
  19. 机器学习性能评估——PR曲线与ROC曲线
  20. ES第十三天-扩展查询-前缀匹配、通配符查询、正则查询、模糊匹配、句子前缀匹配

热门文章

  1. 【Docker】容器的几种网络模式
  2. 2022-2028年中国地沟油制生物柴油行业市场研究及前瞻分析报告
  3. 2022-2028年中国未硫化橡胶制品行业市场运行格局及未来前景展望报告
  4. LeetCode中等题之最优除法
  5. Tomcat 1099端口占用重启无效,查不到进程,改换端口无效解决方案
  6. 作业函数的定义与调用
  7. TensorFlowMNIST数据集逻辑回归处理
  8. 算法编程Algos Programming
  9. YOLOv4全文阅读(全文中文翻译)
  10. android中getMeasuredHeigh()为0的问题