Android 内容观察者 ContentObserver 类
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 类相关推荐
- Android内容观察者
内容观察者是做什么的? 内容观察者主要用来观察数据库是否被操作了. 以查询数据库为例: 首先注册一个内容观察者(App1): 1 //false 观察的Uri必须是一个确切的Uri 如果是true,只 ...
- 简单步骤:Android studio 内容观察者 - 实现数据变化监测
提示:本篇文章将会尽量保持精简,附加图文解释,焦躁是敲写代码最大的敌人,三连是最大的支持! 文章目录 前言 一.项目介绍 二.使用步骤 1.创建第一个程序 2.导入图片 3.放置界面控件 4.创建数据 ...
- Android 观察系统中短信内容的变化(内容观察者)
//内容观察者(如果系统的短信发生了变化,比如刚获取一条短信,那么将触发onChange方法)ContentResolver contentResolver = getContentResolver( ...
- Android的内容观察者
有个很常见的需求就是当有新的短信来的时候,把内容显示在界面上.这里就要用到内容观察者.就是让你的程序监视短信,如果他内容发生变化的时候,你去获取.而短信那边做的情况就 是,当他自己的数据变化时,他告诉 ...
- 2020-11-12(内容提供者,内容解析者,内容观察者)
内容提供者实现步骤 a.写一个类继承ContentProvider 重写onCreat query delete insert getType b.在清单文件中声明对应的provider节点 auth ...
- 获取未接来电及新短信的小栗子(主要使用ContentObserver类)
1.ContentObserver简单介绍: ContentObserver--内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器( ...
- ContentObserver类的使用
ContentObserver类的使用 application A提供了provider, application B可以使用. application on更新provider后, 要通知appli ...
- android无法实例化服务,Android:无法实例化类:没有空的构造函数
请看下面,我得到一个无法实例化类:当试图运行我的"HomeFragmentListExpand"类时,LogCat中没有空的构造函数错误,即使我清楚地有一个空的构造函数那里.And ...
- Android常用的工具类
2019独角兽企业重金招聘Python工程师标准>>> 最新最准确内容建议直接访问原文:Android常用的工具类 主要介绍总结的Android开发中常用的工具类,大部分同样适用于J ...
最新文章
- 刚刚,DeepMind被IJCAI授予杰出成就奖,因为他家把AlphaGo Zero做成了暖心的新垣结衣?
- unity3d 地面印花_unity怎么实现挖掘泥土?
- 被远程机器长时间无响应 (错误码:[308])_自动折叠式“Rollbot”为完全不受束缚的软机器人铺平了道路...
- 【实践案例】Databricks 数据洞察在美的暖通与楼宇的应用实践
- 操作系统之进程管理:13、吸烟者问题
- 软链接与硬链接的区别;描述通配符与正则表达式的区别
- 2015年上半年总结
- python互斥锁_python互斥锁
- Mac Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA
- linux中fish脚本,FISH:Linux 下的一个智能易用的 Shell
- 工具 - UI原型设计工具Pencil Project
- 美国博士后J1签证北京面签经过
- css横排文字光影效果_css3模糊发光文字动画特效
- 域名(DNS)原理及解析过程详解
- C++跨平台技术 - 线程Thread
- 支付宝小程序动态绑定样式
- 古琴怎么学,初学者应该这么练(一)
- android sqlite加密数据库,Android Sqlite数据库加密
- 机器学习性能评估——PR曲线与ROC曲线
- ES第十三天-扩展查询-前缀匹配、通配符查询、正则查询、模糊匹配、句子前缀匹配