一、知识介绍

1、ContentProvider是内容提供者

ContentResolver是内容解决者(对内容提供的数据进行操作)

ContentObserver是内容观察者(观察内容提供者提供的数据变化)

2、ContentObserver需要ContentResolver进行注册。

resolver.registerContentObserver(uri,true,observer);

①URI(第一个参数):该监听所监听ContentProvider的Uri

②notifyForDescendents(第二个参数):设置为true。(如果请求的uri为content://abc则uri为content://abc/xyz数据改变都将会检测到。

③observer:监听器实例。

3、利用Observer中的onchange方法,当数据发生变化是,自动执行回调方法。

二、项目实践

【步骤】

  ①定义Observer监听器

  ②获取到联系人ContentResolver

   ③注册Observer。

  ④重要的一点:添加访问权限(动态也要)

  ⑤注销Observer

【项目结构】

    

【MainActivity】

【提示】:这里将Observer写成内部类的形式。代码只有这一部分,其他的无需添加。

 import android.Manifest;
import android.content.ContentResolver;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.provider.ContactsContract;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast; public class MainActivity extends AppCompatActivity { ContentResolver resolver = null;
Observer observer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //动态权限申请(同时也要在AndroidManifest文件问进行申请权限)
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS)!=
PackageManager.PERMISSION_GRANTED);
ActivityCompat.requestPermissions(
MainActivity.this,
new String[]{ Manifest.permission.READ_CONTACTS
},0); //实例化Observer
observer = new Observer(new Handler());
//获取resolver
resolver = getContentResolver();
Uri uri = ContactsContract.Contacts.CONTENT_URI;
//注册Observer
resolver.registerContentObserver(uri,true,observer); } class Observer extends ContentObserver{ public Observer(Handler handler) {
super(handler);
} @Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Toast.makeText(MainActivity.this,
"联系人列表发生变化",Toast.LENGTH_SHORT).show();
//onchange 方法中添加Toast便于观察
}
} @Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
//在Activity中注销observer
resolver.unregisterContentObserver(observer);
}
}

【效果】刚刚删除了一条联系人信息

    

【小结】

  ①ContentObserver能够及时的检测到ContentProvider提供的数据变化。

   ②ContentObserver不仅能够针对系统提供的,也可以自己创建的程序之间通过ContentObserver,ContentResolver进行通信

Android ContenObserver 监听联系人数据变化的更多相关文章

  1. e793. 监听JSpinner数据变化

    // Create a nummber spinner JSpinner spinner = new JSpinner(); // Add the listener spinner.addChange ...

  2. 如何在组件中监听vuex数据变化(当vuex中state变化时,子组件需要进行更新,怎么做?)

    todo https://blog.csdn.net/qq_37899792/article/details/97640434

  3. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  4. Android如何监听蓝牙耳机的按键事件

    写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「Bluedio + 红米手机」. 1.蓝牙耳机的 ...

  5. Android如何监听蓝牙耳机的按键事件(转)

    源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「 ...

  6. Android怎样监听蓝牙耳机的按键事件

    Android怎样监听蓝牙耳机的按键事件 写在前面: 直接想要代码非常easy,你直接把滚动栏拉到最底端就能够看到.假设想要十分地了解为什么,那就依照我规划的一步一步来理解.下面測试环境以手头上有的「 ...

  7. Android来电监听和去电监听

    我觉得写文章就得写得有用一些的,必须要有自己的思想,关于来电去电监听将按照下面三个问题展开 1.监听来电去电有什么用? 2.怎么监听,来电去电监听方式一样吗? 3.实战,有什么需要特别注意地方? 监听 ...

  8. 监听EditText的变化

    http://liangruijun.blog.51cto.com/3061169/729505 之前博客上的有关EditText的文章,只是介绍EditText的一些最基本的用法,这次来深入学习一下 ...

  9. Android实时监听网络状态

    Android实时监听网络状态(1)   其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就 ...

随机推荐

  1. 写给大忙人的centos下ftp服务器搭建(以及启动失败/XFTP客户端一直提示“用户身份验证失败”解决方法)

    注:个人对偏向于底层基本上拿来就用的应用,倾向于使用安装包,直接yum或者rpm安装:而对于应用层面控制较多或者需要大范围维护的,倾向于直接使用tar.gz版本. 对于linux下的ftp服务器,实际 ...

  2. PCD文件格式详解及在PCL下读取PCD文件

    一.PCD简介 1.1 PCD版本 在点云库PCL 1.0发布之前,PCD文件格式就已经发展更新了许多版本.这些新旧不同的版本用PCD_Vx来编号(例如PCD_V5.PCD_V6和PCD_V7等),分 ...

  3. [Swift]LeetCode795. 区间子数组个数 | Number of Subarrays with Bounded Maximum

    We are given an array A of positive integers, and two positive integers L and R (L <= R). Return ...

  4. 隔壁老主精讲web页面性能优化。

    首先说一下为什么要进行web页面性能优化,在同样的网络环境下,两个同样能满足你的需求的网站,一个“Biu”的一下就加载出来了,一个卡--卡--卡--卡--卡--才出来,你会选择哪个?研究表明:用户最满 ...

  5. 论JVM爆炸的几种姿势及自救方法,你不得不知!

    前言 如今不管是在面试还是在我们的工作中,OOM总是不断的出现在我们的视野中,所以我们有必要去了解一下导致OOM的原因以及一些基本的调整方法,大家可以通过下面的事例来了解一下什么样的代码会导致OOM, ...

  6. 谷歌浏览器的各种插件网址Chrome插件(谷歌浏览器)-超级详细

    各种各样的插件,可以查找对自己有用的,自行下载安装 http://chromecj.com/

  7. 【JMeter】(2)---HTTP压测

    JMeter---HTTP压测 一.创建线程组 右击-->添加-->Threads(Users)-->线程组 下面对比较重要的几个参数,讲解下: 名称: 就是给你这个线程组起名字. ...

  8. CompletableFuture基本用法

    异步计算 所谓异步调用其实就是实现一个可无需等待被调用函数的返回值而让操作继续运行的方法.在 Java 语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结 ...

  9. Java 多线程(一)—— 概念的引入

      并发和并行 并行:指两个或多个时间在同一时刻发生(同时发生): 并发:指两个或多个事件在一个时间段内发生. 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 C ...

  10. Android--逐帧动画FrameAnimation

    前言 开门见山,本篇博客讲解一下如何在Android平台下播放一个逐帧动画.逐帧动画在Android下可以通过代码和XML文件两种方式定义,本篇博客都将讲到,最后将以一个简单的Demo来演示两种方式定 ...