一、知识介绍
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进行通信