Android,监控ContentProvider的数据改变

有时候应用中需要监听ContentProvider的改变并提供响应,这时候就要利用ContentObserver类了

不管是ContentProvider中实现的,insert,delete,update方法中的任何一个,程序都会调用getContext().getContentResolver().notifyChange(uri,null);

这行代码可用于通知所有注册在该Uri上的监听者,该ContentProvider所共享的数据发生了改变 

监 听ContentProvider数据改变的监听器需要继承ContentObserver类,并重写该基类所定义的onChange(boolean selfChange)方法,当它所监听的ContentProvider所共享的数据发生改变时,该onChange将会触发

为了监听指定的ContentProvider的数据变化,需要通过ContentResolver向指定Uri注册ContentObserver监听器.

用如下方法来注册监听器

registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver observer)

notifyForDescendents :如果该参数设为true,假如Uri为content://abc,那么Uri为content://abc/xyz, content://abc/xyz/foo的数据改变时也会触发该监听器,如果参数为false,那么只有 content://abc的数据改变时会触发该监听器

下面以监听系统的短信为例,下图为模拟发送一条短信

上面有一条短信内容为hello,下面启动监听程序在logcat中打印该短信的相关信息

下面为代码

    package WangLi.IO.MonitorSms;  

    import android.app.Activity;
    import android.database.ContentObserver;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Handler;  

    public class MonitorSms extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //为content://sms的数据改变注册监听器
            this.getContentResolver().registerContentObserver(Uri.parse("content://sms"), true,
                    new SmsObserver(new Handler()));
        }
        //根据自定义的ContentObserver监听类
        private final class SmsObserver extends ContentObserver
        {  

            public SmsObserver(Handler handler) {
                super(handler);
                // TODO Auto-generated constructor stub
            }
            public void onChange(boolean selfChange)
            {
                //查询发送箱中的短信(处于正在发送状态的短信放在发送箱)
                Cursor cursor = getContentResolver().query(Uri.parse("content://sms/outbox"),
                        null, null, null, null);
                //遍历查询得到结果集,即可获取用户正在发送的短信
                while(cursor.moveToNext())
                {
                    StringBuilder sb = new StringBuilder();
                    //获取短信的发送地址
                    sb.append("address=").append(
                            cursor.getString(cursor.getColumnIndex("address")));
                    //获取短信标题
                    sb.append(";subject=").append(
                            cursor.getString(cursor.getColumnIndex("body")));
                    //获取短信发送时间
                    sb.append(";time=").append(
                            cursor.getLong(cursor.getColumnIndex("date")));
                    System.out.println("Has Sent SMS:::" + sb.toString());
                }
            }
        }
    }  
时间: 06-25

Android,监控ContentProvider的数据改变的相关文章

Android学习笔记二十二.使用ContentProvider实现数据共享(五).监听ContentProvider的数据改变

一.使用ContentProvider管理多媒体内容 Android提供了Camera程序来支持拍照.拍摄视频,用户拍摄的相片.视频都将存放在固定的位置.Android同样为这些多媒体内容提供了ContentProvider,所以我们可以通过使用ContentProvider实现其他应用直接访问Camera所拍摄的照片.视频等. 1.多媒体ContentProvider的Uri (1)MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:存储在外部存储器(SD卡

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

转载自:http://blog.csdn.net/woshixuye/article/details/8281385 一.提出需求 有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider:A应用修改了B应用的数据,插入了一条数据.有这样一个需求,此时C应用需要得到数据被修改的通知并处理相应操作. 二.示例代码 A应用 /** * 对内容提供者进行操作 * * @author XY * */ public class MainActivity exten

Android之ContentProvider数据存储

一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数据暴露的.那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URL来表示外界需要访问的"数据库". ContentProvider提供了一种多应用间数据共享的方式. ContentProvider是个实现了一组用于提供其他应用程序存取数据的标准方法的类.应用

android之ContentProvider和Uri具体解释

一.使用ContentProvider(内容提供者)共享数据 在android中ContentProvider的作用是对外共享数据,就是说能够通过ContentProvider把应用中的数据共享给其它应用訪问,其它应用能够通过ContentProvider对你应用中的数据进行添删改查. 就像我们手机的通话记录.我没要查看某个通话时间.这是须要调用通话记录中的数据.此时就该用到了ContentProvider数据共享. 关于数据共享.在文件操作模式,通过指定文件的操作模式为Context.MODE

解读Android之ContentProvider(2)创建自己的Provider

本文翻译自android官方文档,结合自己测试,整理如下. content provider管理数据的访问,我们可以在自己的应用程序中实现一个或多个自定义的provider(通过继承抽象类ContentProvider),当然这些provider需要在manifest文件中注册.尽管content provider是用来为其它程序来访问数据的,但是在自己程序中的activities显然可以对这些数据进行处理. 创建provider之前注意事项 确定是否需要提供content provider.若

android 应用间共享数据,调用其他app数据资源

1.通过获取相同shareUserId的context 1)相同shareUserId,不同进程,shareUserId 和 lunix进程的uid不是同一概念. 2)相同shareUserId,相同进程 资源共享原理分析. 2.contentprovider 共享数据 参看网址: Android PackageManagerService分析一:PMS的启动

android 监控应用进程

在android系统中,怎么监控应用的进程改变及消亡呢? 至于监控应用进程能做什么,这个就不多说了,你懂的. 在android系统中有这么一个类ActivityManagerNative,看名称就大概能猜到该类是做什么用的了,该类中有个方法“registerProcessObserver” 1 public void registerProcessObserver(IProcessObserver observer) throws RemoteException { 2 Parcel data

使用ContentProvider共享数据

独占 共享 XML 文本 二进制文件 数据量大(数据库,开源)  这些都是进程独享的 / Content Provider 可以进程共享 1.extends ContentProvider,并重写以下方法 public boolean onCreate() public Uri insert(Uri uri, ContentValues values) public int delete(Uri uri, String selection, String[] selectionArgs) pub

Android之ContentProvider

ContentProvider是Android的四大组件之一. 先说说我对这个东西的理解吧,ContentProvider就是用来存数据,用来共享数据的,比如:手机通讯录的联系人的信息以及手机上面存的相片,视频等等. 比较官方的解释: Android中的Content provider机制可支持在多个应用中存储和读取数据.这也是跨应用共享数据的方式之一,还有文件,sharePreference,SQLite数据库等方式存储共享数据库,但是ContentProvider更好的提供了数据共享接口的统