欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android ContenObserver 监听联系人数据变化

程序员文章站 2022-05-12 13:01:07
一、知识介绍 1、ContentProvider是内容提供者 ContentResolver是内容解决者(对内容提供的数据进行操作) ContentObserver是内容观察者(观察内容提供者提供的数据变化) 2、ContentObserver需要ContentResolver进行注册。 resol ......

一、知识介绍

   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

【项目结构】

    Android ContenObserver 监听联系人数据变化

【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 }

 

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

    Android ContenObserver 监听联系人数据变化

【小结】

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

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