一、提出需求

有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider;A应用修改了B应用的数据,插入了一条数据。有这样一个需求,此时C应用需要得到数据被修改的通知并处理相应操作。

二、示例代码

A应用

public class MainActivity extends Activity
{

@Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 }

public void insert(View v)
 {
  Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
  ContentResolver resolver = this.getContentResolver();
  ContentValues values = new ContentValues();
  values.put("name", "xy_new_new");
  values.put("phone", "xy_new_111");
  resolver.insert(uri, values);
 }
}

B应用
package cn.xy.cotentProvider.app.providers;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
import cn.xy.cotentProvider.service.DBOpeningHelper;

public class PersonProvider extends ContentProvider
{
 private DBOpeningHelper dbHelper;

// 若不匹配采用UriMatcher.NO_MATCH(-1)返回
 private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

// 匹配码
 private static final int CODE_NOPARAM = 1;
 private static final int CODE_PARAM = 2;

static
 {
  // 对等待匹配的URI进行匹配操作,必须符合cn.xyCompany.providers.personProvider/person格式
  // 匹配返回CODE_NOPARAM,不匹配返回-1
  MATCHER.addURI("cn.xyCompany.providers.personProvider", "person", CODE_NOPARAM);

// #表示数字 cn.xyCompany.providers.personProvider/person/10
  // 匹配返回CODE_PARAM,不匹配返回-1
  MATCHER.addURI("cn.xyCompany.providers.personProvider", "person/#", CODE_PARAM);
 }

@Override
 public boolean onCreate()
 {
  dbHelper = new DBOpeningHelper(this.getContext());
  return true;
 }

@Override
 public Uri insert(Uri uri, ContentValues values)
 {
  SQLiteDatabase db = dbHelper.getWritableDatabase();
  switch (MATCHER.match(uri))
  {
   case CODE_NOPARAM:
    // 若主键值是自增长的id值则返回值为主键值,否则为行号,但行号并不是RecNo列
    long id = db.insert("person", "name", values);
    Uri insertUri = ContentUris.withAppendedId(uri, id);
    // 发出变化通知(非必须)设监听者为null。
    // 若设置某个监听者则不管有多少个监听者,该监听者一定可以获得该通知
    getContext().getContentResolver().notifyChange(uri, null);
    return insertUri;
   default:
    throw new IllegalArgumentException("this is unkown uri:" + uri);
  }
 }
 ......
}

C应用
package cn.xt.contentProvider.lisenter;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

public class MainActivity extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
  ContentResolver resolver = this.getContentResolver();
  resolver.registerContentObserver(uri, true, new PersonContentObserver(new Handler()));
 }

private class PersonContentObserver extends ContentObserver
 {
  public PersonContentObserver(Handler handler)
  {
   super(handler);
  }

// 得到数据的变化通知,该方法只能粗略知道数据的改变,并不能判断是哪个业务操作进行的改变
  @Override
  public void onChange(boolean selfChange)
  {
   // select * from person order by id desc limit 1 // 取得最近插入的值(序号大——>小并取第一个)
   Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
   ContentResolver resolver = MainActivity.this.getContentResolver();
   Cursor cursor = resolver.query(uri, null, null, null, "id desc limit 1");
   if(cursor.moveToFirst())
   {
    String name = cursor.getString(cursor.getColumnIndex("name"));
    Log.i("lisenter", name);
   }
  }
 }
}

关于contentProvider的基本使用,请参看本博客博文《Android开发13——内容提供者ContentProvider的基本使用》

http://blog.sina.com.cn/s/blog_67aaf444010162bj.html

Android开发14——监听内容提供者ContentProvider的数据变化的更多相关文章

  1. [Android Pro] 监听内容提供者ContentProvider的数据变化

    转载自:http://blog.csdn.net/woshixuye/article/details/8281385 一.提出需求 有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者 ...

  2. Android开发之监听发出的短信

    执行效果图: 预备知识: 为了监听指定的ContentProvider的数据的改变,须要通过ContentResolver向指定Uri注冊CotentObserver监听器.ContentResolv ...

  3. Android开发-之监听button点击事件

    一.实现button点击事件的方法 实现button点击事件的监听方法有很多种,这里总结了常用的四种方法: 1.匿名内部类 2.外部类(独立类) 3.实现OnClickListener接口 4.添加X ...

  4. android开发事件监听

    第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适, ...

  5. 【Android开发】监听图库数据库的变化

    步骤一: 保存图片或者删除之前,初始化ContentObserver ScreenshotContentObserver mScreenObserver = new ScreenshotContent ...

  6. Android 短信监听及用途分析

    监听系统短信这个只能作为一个技术点来研究下,读者可能在工作中可能不会哦涉及到,一般的应用软件也不会有这个需求 但是作为程序员呢,多了解一下也是好的. Android 监听系统短信有什么用? 1.对系统 ...

  7. vue 监听对象里的特定数据

    vue  监听对象里的特定数据变化 通常是这样写的,只能监听某一个特定数据 watch: { params: function(val) { console.log(val) this.$ajax.g ...

  8. 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

    1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  9. Android零基础入门第34节:Android中基于监听的事件处理

    原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...

随机推荐

  1. Swift学习笔记-1

    Apple官方开发手冊地址: https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/La ...

  2. linux下mysql-5.5.15安装详细步骤

    linux下mysql-5.5.15安装详细步骤 注:该文档中用到的目录路径以及一些实际的值都是作为例子来用,具体的目录路径以各自安装时的环境为准 mysql运行时需要一个启动目录.一个安装目录和一个 ...

  3. STL与多线程+写时拷贝

    http://blog.csdn.net/liuxuejiang158blog/article/details/13251379 STL并不是线程安全的,当多个线程同时读取STL时没什么问题.当多个线 ...

  4. AVL树的实现例程

    /* AVL树的节点声明 */ #ifndef _AVLTREE_H #define _AVLTREE_H struct AvlNode; typedef struct AvlNode *Positi ...

  5. 使用ADS1.2的注意事项及常用技巧

    如果创建的项目中有多个文件时(尤其是编译后的镜像大小超过4K时),一定要在link order栏下调整文件顺序,主要是前几个文件的顺序(2440init.s.2440slib.s.nand.c这三个文 ...

  6. PHP採集利器:依据開始字符串和结束字符串截取须要的採集内容数据

    PHP採集利器:依据開始字符串和结束字符串截取须要的採集内容数据 function strCutByStr(&$str, $findStart, $findEnd = false, $enco ...

  7. Mac Oracle SqlDeveloper 快捷输入

    用惯了 plsql 的快捷输入,换了 Mac Oracle SqlDeveloper反倒是找不到了,翻出去找了几次终于找到 SqlDeveloper -- preferences -- 数据库(dat ...

  8. static 和 no static Member function学习

    以下是做实验的一段代码: #include <iostream> using namespace std; typedef void (*p)(); class Object { publ ...

  9. lnmp环境的使用教程

    lnmp环境的使用 安装的软件都安装到了:/usr/local 管理nginx service nginx start|stop|restart|reload 管理mysql 直接执行mysql即可登 ...

  10. HDU 1023 Train Problem II 大数打表Catalan数

    一个出栈有多少种顺序的问题.一般都知道是Catalan数了. 问题是这个Catalan数非常大,故此须要使用高精度计算. 并且打表会速度快非常多.打表公式要熟记: Catalan数公式 Cn=C(2n ...