内容观察者

在Android项目中我们常常需要检测另一个应用私有数据的变化与否,如何检测另一个数据库应用中的数据变化,我们通过下面的案例来讲述具体的操作。

应用场景:有两个应用,一个是“01_数据库应用”,另一个是“07_内容观察者”;第二个应用监测第一个应用数据库的变化,当第一个应用数据库发生变化便即时通知第二个应用。实现方法如下:

轮询

若要监测数据库中数据的变化与否,我们可以在当前应用中编写一个定时器,该定时器的工作是每隔一段时间查询数据库中的数据,将查询的结果与之前查询的数据库记录进行对比从而实现监测的目的。

这种方法虽然可行,但是效率低且内存消耗大,因此并不推举。

观察者

ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关。

这种方式效率高内存消耗少,在项目中应该使用这种方法。

编写代码

01_数据库应用中定义了一个数据库person.db并注册了该数据库的内容提供者,下面我们通过内容观察者来监听该数据库应用的变化,实现代码如下:

  • 新建另一个应用“07_内容观察者的原理”,在该应用的主Activity中编写例1-1代码:

例1-1        注册内容观察者

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. // 该uri路径指向数据库应用中的数据库info表
  6. Uri uri = Uri.parse("content://com.itheima.db/info/");
  7. //注册内容观察者,参数uri指向要监测的数据库info表,参数true定义了监测的范围,最后一个参数是一个内容观察者对象
  8. getContentResolver().registerContentObserver(uri, true,
  9. new MyObserver(new Handler()));
  10. }

复制代码

例1-1实现了内容观察者的注册工作,即当数据库应用中的数据变化了该应用便可以监测到。在上述代码块中有一个参数new MyObserver(new Handler()),MyObserver是一个观察者对象,继承ContentObserver并实现了onChange方法。具体代码如例1-2所示

例1-1        MyObserver.class

  1. private class MyObserver extends ContentObserver{
  2. public MyObserver(Handler handler) {//handler 是一个消息处理器。
  3. super(handler);
  4. }
  5. @Override
  6. //当info表中的数据发生变化时则执行该方法
  7. public void onChange(boolean selfChange) {
  8. System.out.println("哈哈数据库的内容变化了");
  9. super.onChange(selfChange);
  10. }
  11. }

复制代码

  • 01_数据库应用中添加通知数据库变化的代码,具体代码如下:

当新加一条数据记录时,此时数据库info表会发生变化,因此我们需调整添加代码如例1-3所示:

例1-3

  1. @Override
  2. public Uri insert(Uri uri, ContentValues values) {
  3. int code = mUriMatcher.match(uri);
  4. if (code == SUCCESS) {
  5. SQLiteDatabase db = helper.getWritableDatabase();
  6. long id = db.insert("info", null, values);
  7. db.close();
  8. //content://com.itheima.db/info/5
  9. //大吼一声,讲数据库的内容变化了。
  10. getContext().getContentResolver().notifyChange(uri, null);
  11. return Uri.parse("content://com.itheima.db/info/"+id);
  12. }else{
  13. throw new IllegalArgumentException("uri 不匹配");
  14. }
  15. }

复制代码

当删除一条数据记录时,此时数据库info表会发生变化,因此我们需调整添加代码如例1-4所示:

例1-4

  1. @Override
  2. public int delete(Uri uri, String selection, String[] selectionArgs) {
  3. int code = mUriMatcher.match(uri);
  4. if (code == SUCCESS) {
  5. SQLiteDatabase db = helper.getWritableDatabase();
  6. int result = db.delete("info", selection, selectionArgs);
  7. db.close();
  8. if(result>0){
  9. //大吼一声,讲数据库的内容变化了。
  10. getContext().getContentResolver().notifyChange(uri, null);
  11. }
  12. return result;
  13. }else{
  14. throw new IllegalArgumentException("uri 不匹配");
  15. }
  16. }
时间: 2024-10-28 10:02:07

内容观察者的相关文章

内容观察者使用(程序锁应用中的使用)

1.在Dao层的增删改查方法中,添加一句代码,通知内容观察者,数据库发生改变. context.getContentResolver().notifyChange(Uri.parse("content://applock/change"), null); 参数1:自定义Uri,在注册内容观察者时匹配 2.在需要使用内容观察者的类中(即DogService),注册内容观察者.一旦数据库的数据发生改变,就要调用内容观察者中的onchange方法,在这里就是再一次findAll(). //使

Android10_内容提供者_内容观察者_标题栏

安卓四大组件Activity ,Service,BroadCastReceiver,ContentProvider(内容提供者) 1.1内容提供者的作用: 应用程序创建的数据库默认都是私有的,别的应用程序不可以访问里面的数据,如果有需求把自己应用程序私有的数据库暴露给别的用户增删改查,就需要使用内容提供者. 1.2 内容提供者的代码实现 在需要提供给它人数据的应用中 ①创建一个项目,并且创建数据库(数据库开启帮助类)(非必要) ②创建一个类,继承ContentProvider内容提供者, 内容提

无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)

1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者,例子如下: private static final Uri URI = Uri.parse("content://person.db"); public class

内容观察者实现短信监听

内容观察者实现短信监听 通过内容观察者监听短信是否发生变化,如果发生变化,就用内容提供者读取短信的内容. 原理: 当短信发生变化(比如说来短信),短信应用就会通知内容观察者我的短信发生了变化,并把变化位置短信的uri传过来,有uri之后,内容提供者就可以很方便的读取短信内容了,不过肯定要保证权限够. package com.example.duanxinjianting; import android.app.Activity; import android.database.ContentOb

内容观察者(一个简单的手机短信窃听器)

一丶内容观察者  * 在内容提供者中要通知内容发生了变化         getContext().getContentResolver().notifyChanges(uri,null) ; //null表示没有固定的接收者  * 在其他应用中写一个观察者,并注册一个实例         getContentResolver().registerContentObserver(uri,true,Observer) ; //uri观察的主机数据,true表示只要主机匹配即可,Observer表示

android ContentObserver内容观察者基本使用

package com.example.observertest; import android.content.ContentResolver; import android.database.ContentObserver; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.ActionBarActivity; import an

内容提供者和内容观察者

1.创建一个内容提供者,继承contentProvider,作为四大组件之一,contentProvider需要在配置文件中进行配置 <provider android:name="cn.itcast.mobilesafe.provider.AppLockedProvider" android:authorities="cn.itcast.applockprovider"> </provider> 2. package cn.itcast.m

Android 利用内容观察者实现短信窃听

<Android 内容观察者的原理>中介绍了内容观察者的一些基本原理,并做了简单的实战,本文接着进一步做一个小项目实战 package com.wuyudong.smslistener; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.net.Uri; import andr

Android开发之内容观察者

内容观察者: 当关注应用的数据库数据改变时,内容提供者会发出通知,在内容提供者的uri上注册一个内容观察者,就可以收到数据改变的通知 实现步骤: 1.假如是自定义的ContentProvider,需要在数据发送改变的方法中实现以下代码: 1 ContentResolver cr = getContext().getContentResolver(); 2 //发出通知,所有注册在这个uri上的内容观察者都可以收到通知 3 cr.notifyChange(uri, null); notifyCha