关于ContentProvider(二)

上篇说到了ContentProvider的基本使用方法,实现了软件之间的数据互通。然而,仅此是不够的。有时候我们会希望两个软件(A和B)共同使用同一个ContentProvider里面的数据,因此,我们需要在一定程度上需要知道另一个软件的行业。比如A希望知道B有没有操作ContentProvider,或者从A上次操作到现在ContentProvider的数据有没有发生变化。在此ContentProvider为我们提供了一个非常方便的方法,

notifyChange(Uri uri, ContentObserver observer);

其中第一个参数uri即是当前ContentProvider的Uri通过delete方法的参数传入。第二个参数表示指定的通知接收者,当输入null时表示不指定,所有接收者都可接收通知。

使用方法:

1、在ContentProvider中调用notifyChange方法

public int delete(Uri uri, String selection, String[] selectionArgs) {
        int result=111;
        switch (uriMatcher.match(uri)){
            case 1:
                temp=selection;
                this.getContext().getContentResolver().notifyChange(uri,null);

2、在使用ContentProvider的软件(如A)中,注册监听者public final void registerContentObserver(Uri uri, boolean notifyForDescendents,ContentObserver observer)

this.getContentResolver().registerContentObserver(uri1,true, new ChangeOb(new Handler()));

其中uri1为刚刚ContentProvider中的对应uri,第二个参数为当参数notifyForDescendents为true时,表示要监控所有以uri为前缀的URI对应的数据变化,第三个参数为监听到数据变化后的动作。

3、实现ChangeOb,即监听到数据变化后的动作。

private class ChangeOb extends ContentObserver{     
        public ChangeOb(Handler handler) {
            super(handler);
        }
        public void onChange(boolean selfChange){
            String a=contentResolver.getType(uri1);
            //Toast.makeText(MainActivity.this, Integer.valueOf(result).toString(), Toast.LENGTH_SHORT).show();
            Toast.makeText(MainActivity.this, a , Toast.LENGTH_SHORT).show();
        }
    }

以上,即可监听ContentProvider的数据变化

原文地址:https://www.cnblogs.com/fishbone-lsy/p/4204331.html