Android开发14——监听内容提供者ContentProvider的数据变化

简介:

一、提出需求

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

 

二、示例代码

 

 
  1. A应用  
  2.  
  3. public class MainActivity extends Activity  
  4. {  
  5.  
  6.  @Override 
  7.  public void onCreate(Bundle savedInstanceState)  
  8.  {  
  9.   super.onCreate(savedInstanceState);  
  10.   setContentView(R.layout.main);  
  11.  }  
  12.  
  13.  public void insert(View v)  
  14.  {  
  15.   Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  
  16.   ContentResolver resolver = this.getContentResolver();  
  17.   ContentValues values = new ContentValues();  
  18.   values.put("name""xy_new_new");  
  19.   values.put("phone""xy_new_111");  
  20.   resolver.insert(uri, values);  
  21.  }  
  22. }  
  23.  
  24.  
  25. B应用  
  26. package cn.xy.cotentProvider.app.providers;  
  27. import android.content.ContentProvider;  
  28. import android.content.ContentUris;  
  29. import android.content.ContentValues;  
  30. import android.content.UriMatcher;  
  31. import android.database.Cursor;  
  32. import android.database.sqlite.SQLiteDatabase;  
  33. import android.net.Uri;  
  34. import android.util.Log;  
  35. import cn.xy.cotentProvider.service.DBOpeningHelper;  
  36.  
  37.  
  38. public class PersonProvider extends ContentProvider  
  39. {  
  40.  private DBOpeningHelper dbHelper;  
  41.  
  42.  // 若不匹配采用UriMatcher.NO_MATCH(-1)返回  
  43.  private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);  
  44.  
  45.  // 匹配码  
  46.  private static final int CODE_NOPARAM = 1;  
  47.  private static final int CODE_PARAM = 2;  
  48.  
  49.  static 
  50.  {  
  51.   // 对等待匹配的URI进行匹配操作,必须符合cn.xyCompany.providers.personProvider/person格式  
  52.   // 匹配返回CODE_NOPARAM,不匹配返回-1  
  53.   MATCHER.addURI("cn.xyCompany.providers.personProvider""person", CODE_NOPARAM);  
  54.  
  55.   // #表示数字 cn.xyCompany.providers.personProvider/person/10  
  56.   // 匹配返回CODE_PARAM,不匹配返回-1  
  57.   MATCHER.addURI("cn.xyCompany.providers.personProvider""person/#", CODE_PARAM);  
  58.  }  
  59.  
  60.  @Override 
  61.  public boolean onCreate()  
  62.  {  
  63.   dbHelper = new DBOpeningHelper(this.getContext());  
  64.   return true;  
  65.  }  
  66.  
  67.    
  68.  @Override 
  69.  public Uri insert(Uri uri, ContentValues values)  
  70.  {  
  71.   SQLiteDatabase db = dbHelper.getWritableDatabase();  
  72.   switch (MATCHER.match(uri))  
  73.   {  
  74.    case CODE_NOPARAM:  
  75.     // 若主键值是自增长的id值则返回值为主键值,否则为行号,但行号并不是RecNo列  
  76.     long id = db.insert("person""name", values);  
  77.     Uri insertUri = ContentUris.withAppendedId(uri, id);  
  78.     // 发出变化通知(非必须)设监听者为null。  
  79.     // 若设置某个监听者则不管有多少个监听者,该监听者一定可以获得该通知  
  80.     getContext().getContentResolver().notifyChange(uri, null);  
  81.     return insertUri;  
  82.    default:  
  83.     throw new IllegalArgumentException("this is unkown uri:" + uri);  
  84.   }  
  85.  }  
  86.  ......  
  87. }  
  88.  
  89.  
  90. C应用  
  91. package cn.xt.contentProvider.lisenter;  
  92. import android.app.Activity;  
  93. import android.content.ContentResolver;  
  94. import android.database.ContentObserver;  
  95. import android.database.Cursor;  
  96. import android.net.Uri;  
  97. import android.os.Bundle;  
  98. import android.os.Handler;  
  99. import android.util.Log;  
  100.  
  101. public class MainActivity extends Activity  
  102. {  
  103.  @Override 
  104.  public void onCreate(Bundle savedInstanceState)  
  105.  {  
  106.   super.onCreate(savedInstanceState);  
  107.   setContentView(R.layout.main);  
  108.   Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  
  109.   ContentResolver resolver = this.getContentResolver();  
  110.   resolver.registerContentObserver(uri, truenew PersonContentObserver(new Handler()));  
  111.  }  
  112.  
  113.  private class PersonContentObserver extends ContentObserver  
  114.  {  
  115.   public PersonContentObserver(Handler handler)  
  116.   {  
  117.    super(handler);  
  118.   }  
  119.  
  120.   // 得到数据的变化通知,该方法只能粗略知道数据的改变,并不能判断是哪个业务操作进行的改变  
  121.   @Override 
  122.   public void onChange(boolean selfChange)  
  123.   {  
  124.    // select * from person order by id desc limit 1 // 取得最近插入的值(序号大——>小并取第一个)  
  125.    Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  
  126.    ContentResolver resolver = MainActivity.this.getContentResolver();  
  127.    Cursor cursor = resolver.query(uri, nullnullnull"id desc limit 1");  
  128.    if(cursor.moveToFirst())  
  129.    {  
  130.     String name = cursor.getString(cursor.getColumnIndex("name"));  
  131.     Log.i("lisenter", name);  
  132.    }  
  133.   }  
  134.  }  
  135. }  
  136.  

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

本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1085439如需转载请自行联系原作者


woshixuye111

相关文章
|
11月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1834 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
11月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1181 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
11月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1237 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
12月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
984 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
11月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
495 0
|
12月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
1440 6
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
752 11
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
616 0
|
数据采集 Android开发 索引
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(二)
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(二)
830 0
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(二)
|
数据采集 存储 传感器
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(一)
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(一)
528 0
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(一)

热门文章

最新文章