• 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进行通信

     

  • 相关阅读:
    nginx相关总结
    nginx 虚拟主机+反向代理+负载均衡
    linux文本查看与搜索
    mysqldump导出数据出现问题
    转载 | 缩小浏览器窗口右边出现空白
    转载 | Sublime Text3 安装以及初次配置
    转载 | Sublime text3 实用快捷键整理
    转载 | SVG向下兼容优雅降级方法
    CSS等分布局方法
    如何用实现文字环绕图片?
  • 原文地址:https://www.cnblogs.com/xqz0618/p/contact_observer.html
Copyright © 2020-2023  润新知