Android ContenObserver 监听联系人数据变化

一、知识介绍

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写成内部类的形式。代码只有这一部分,其他的无需添加。

 1 import android.Manifest;
 2 import android.content.ContentResolver;
 3 import android.content.pm.PackageManager;
 4 import android.database.ContentObserver;
 5 import android.net.Uri;
 6 import android.os.Handler;
 7 import android.provider.ContactsContract;
 8 import android.support.v4.app.ActivityCompat;
 9 import android.support.v7.app.AppCompatActivity;
10 import android.os.Bundle;
11 import android.util.Log;
12 import android.widget.Toast;
13
14 public class MainActivity extends AppCompatActivity {
15
16     ContentResolver resolver = null;
17     Observer observer = null;
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22
23         //动态权限申请(同时也要在AndroidManifest文件问进行申请权限)
24         if (ActivityCompat.checkSelfPermission(this,
25                 Manifest.permission.READ_CONTACTS)!=
26                 PackageManager.PERMISSION_GRANTED);
27                 ActivityCompat.requestPermissions(
28                         MainActivity.this,
29                         new String[]{ Manifest.permission.READ_CONTACTS
30         },0);
31
32         //实例化Observer
33         observer = new Observer(new Handler());
34         //获取resolver
35         resolver = getContentResolver();
36         Uri uri = ContactsContract.Contacts.CONTENT_URI;
37         //注册Observer
38         resolver.registerContentObserver(uri,true,observer);
39
40     }
41
42     class Observer extends ContentObserver{
43
44         public Observer(Handler handler) {
45             super(handler);
46         }
47
48         @Override
49         public void onChange(boolean selfChange) {
50             super.onChange(selfChange);
51             Toast.makeText(MainActivity.this,
52                     "联系人列表发生变化",Toast.LENGTH_SHORT).show();
53             //onchange 方法中添加Toast便于观察
54         }
55     }
56
57     @Override
58     public void onDetachedFromWindow() {
59         super.onDetachedFromWindow();
60         //在Activity中注销observer
61         resolver.unregisterContentObserver(observer);
62     }
63 }

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

    

【小结】

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

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

原文地址:https://www.cnblogs.com/xqz0618/p/contact_observer.html

时间: 2024-07-30 13:38:52

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

vue 监听data数据变化

当被监听的数据发生变化是,函数被执行 created() { this.$watch("Withdrawals", function (newValue, oldValue) { if(this.Withdrawals==false){ console.log("123") } }) } data(){ return{ Withdrawals:false } }

[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 ContentObserver 监听图库变化

相比FileObserver的繁琐,ContentObserver在易用性上还是要优秀一些的,因此我们可以在有监听需求的时候选用一下,一个功能多一种实现方式,就多了一个比较嘛. 关于ContentObserver ContentObserver顾名思义,就是内容观察器的意思,跟FileObserver很像,只不过前者是监听数据库的变化. 实现步骤 这里我们就拿图库监听做一个例子: 在做之前先给出图库相对的数据库的Uri: MediaStore.Images.Media.EXTERNAL_CONT

【Android进阶学习】监听EditText的变化

之前博客上的有关EditText的文章,只是介绍EditText的一些最基本的用法,这次来深入学习一下EditText. 监听EditText的变化 使用EditText的addTextChangedListener(TextWatcher watcher)方法对EditText实现监听,TextWatcher是一个接口类,所以必须实现TextWatcher里的抽象方法: 当EditText里面的内容有变化的时候,触发TextChangedListener事件,就会调用TextWatcher里面

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

写在前面: 直接想要代码非常easy,你直接把滚动栏拉到最底端就能够看到.假设想要十分地了解为什么,那就依照我规划的一步一步来理解.下面測试环境以手头上有的「Bluedio + 红米手机」. 1.蓝牙耳机的使用 蓝牙耳机的使用说明书中都会有相关的具体使用说明,这里拣重点说明一下.除了电源开关,耳机上一般有三个键.例如以下所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2Vhcg==/font/5a6L5L2T/fontsize/40

安卓实训第十四天---使用ContentProvider共享数据,并且利用ContentResolver监听共享数据

ContentProvider: 一.当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的好处是统一了数据访问方式. 第二步需要在AndroidManif

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

源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「Bluedio + 红米手机」. 1.蓝牙耳机的使用 蓝牙耳机的使用说明书中都会有相关的详细使用说明,这里拣重点说明一下.除了电源开关,耳机上一般有三个键.如下所示: 它们每个都是多功能键,在不同的情况下有不同的功能.1号键的功能包括:开始播放音乐/停止插入音乐/接听电话/挂断电话:2号键的功能有:

Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.content.BroadcastReceiver;  import android.content.Context;  import android.content.Intent;  import android.net.ConnectivityManager;  import android.ne

Android:监听ListView

本文目录 监听ListView点击事件 监听ListView滚动事件 监听ListView点击事件 使用监听器OnItemClickListener package com.example.testsend; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView.OnIte