Android 内容观察者 ContentObserver 类

news/2024/11/29 10:44:58/

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

 


http://www.ppmy.cn/news/609383.html

相关文章

杀死僵尸进程

ps -A -ostat,ppid,pid,cmd |grep -e ^[Zz]

Android Handler Message 里面的message.what, message.arg1,message.obj,obtainMessage, message.setData的使用

Android Handler Message 里面的message.what, message.arg1,message.arg2,message.obj,obtainMessage, message.setData 的使用 1 message.what: 用户定义的消息代码,以便收件人可以识别 2 message.arg1 定义传递的int 类型的值1 3 message.arg2 定义传递的int 类…

STL中deque

以下学习一下STL中另一种序列容器——deque。 deque表示double-ended queue,即双向队列,deque是通过作为动态数组的方式实现的,这样可以在两端插入元素。因此,deque可以在任何一个方向进行扩展。同时可以在中间插入元素。在开头或…

大数据Spark(十八):Spark Core的RDD Checkpoint

文章目录 RDD Checkpoint 引入 API 代码演示 总结:持久化和Checkpoint的区别 问题:

推理部署概述

推理部署概述 人工智能算法的重要能力,是可对未知的新数据做出预测,而所依据的则是在已知数据上训练出的模型。因为这个过程与人面对问题时依据经验思考推导后得出结论相类似,所以在人工智能领域又被称为推理(Inference&#xff0…

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

问题描述:Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 问题指向这一行 String companylng (String) homeObj.get("lng");这个问题就是强转出现的问题, 处理方法使用 String.valueOf String companylng St…

Java字符串中字符的Unicode码点、编码

以前对于Java字符串中字符的Unicode码点、UTF编码没有仔细研究。今天研究了下。 Unicode是一个字符集,其实是一个映射,给每个字符映射了一个数值,称为码点(Code Point)。 而UTF-8、UTF-16、UTF-32则是对Unicode码点的转…

一周总结(3)

本周主要学习了大道至简中的内容,学到很多新知识 基本是下午学一会,时间不长但还行 下周还是要看大道至简,继续学习 转载于:https://www.cnblogs.com/ICDTAD/p/11254339.html