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
【项目结构】
【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进行通信
推荐阅读
-
浅谈Android为RecyclerView增加监听以及数据混乱的小坑
-
Android中的webview监听每次URL变化实例
-
Android 动态注册监听网络变化实例详解
-
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
-
vue select选择框数据变化监听方法
-
Android进程通信AIDL之数据监听,监听器移除
-
Android Studio 基础 之 获取蓝牙Bluetooth 的状态,设置的蓝牙Bluetooth 的开关状态,并监听蓝牙Bluetooth 的状态变化方法整理
-
Vue监听数据对象变化源码
-
详解Vue监听数据变化原理
-
浅谈Android为RecyclerView增加监听以及数据混乱的小坑