Android笔记(ContentObserver)
一、 内容观察者的用途
内容观察者主要用来实时监听内容提供者共享的数据是否发生变化。
应用场景:比方有些app会监听系统截图功能,他会监听媒体库中插入的最后一条图片数据,该图片符合特定的规则就认为被截屏了,可以对截屏的图片做二次操作,这个功能的实现就利用了内容观察者。
二、 ContentObserver原理
如上图,B程序通过ContentResolver类操作A程序通过ContentProvider类暴露出来的数据的相关原理见上一次笔记,这里不再赘述。
C程序使用内容观察者监听A程序使用内容提供者暴露出来的数据变化的原理如下:
Step1:A程序的内容提供者中调用ContentResolver的notifyChange()方法,调用此方法后,B程序对A程序的数据进行操作,A程序便会向消息中心发送数据变化的消息。
Step2:C程序注册了内容观察者,C程序会观察消息中心的消息,如果观察到A程序的数据发生变化,便会触发C程序内容观察者中的onChange()方法,在onChange方法中处理相关逻辑
三、 在Android Studio中的具体操作步骤
如果是B程序观察A程序中通过内容提供者暴露出来的数据的变化,步骤如下:
Step 1: 在A程序ContentProvider当中的insert(),update(),delete()中调用notifyChange()方法来通知消息中心暴露出来的数据发生了变化
(为什么是在增删改三种方法中调用notifyChange()?答:因为只有增加删除修改会更改数据库中的数据,查询不会更改数据)
Step 2: 在B程序当中创建一个内容观察者,重写ContentObserver中的onChange()方法(即知晓了A程序数据发生变化后需要做一些什么样的处理)
Step3: 在B程序中注册内容观察者,首先得有uri,uri表示B程序当前要观察的目标数据,再显示地进行注册。注册时调用的是ContentResolver对象中的registerContentObserver方法,示例如下:getContentResolver().registerContentObserver(uri, true, new MyObserver(new Handler()));
该方法有三个参数,第一个参数是内容提供者的URI(即要访问的目标),第二个参数(notifyForDescendents ),这个参数的值为false时表示只匹配当前提供的Uri,当值为true时表示可以匹配Uri派生的其他Uri。(举例:比如A程序里UriMatcher注册了三个Uri分别是:
content://你的Authority/table1,
content://你的Authority /table1/#
content://你的Authority /table1/id1
假设当前需要观察的Uri为content://你的Authority/table1,如果发生数据变化的Uri为content://你的Authority / table1/id1 ,当notifyForDescendents为 false,那么该ContentObserver会监听不到,但是当notifyForDescendents 为ture,能捕捉该Uri的数据库变化)第三个参数是创建的内容提供者。
Step4: 在B程序中取消对内容观察者的注册,取消的逻辑一般是写在onDestory()中, 取消注册调用的是ContentResolver对象中的unregisterContentObserver方法。示例:getContentResolver().unregisterContentObserver(new MyObserver(new Handler()));只有一个参数,该参数就是要取消的内容观察者。