为了账号安全,请及时绑定邮箱和手机立即绑定

使用contentProvider在不同进程间传输数据

标签:
Android

contentProvider作为不同软件之间的数据共享,提供统一的接口,

contentProvider 主要功能是封装对数据库的增删改查,并可以对外提供结果,供其它应用程序访问本应用数据库里面的数据,首先我们要创建一个类继承ContentProvider,并且需要实现query,getType,insert,delste,update几个函数,在注册contentProvider指定一个authorities这个是唯一的,我们写contentProvider的时候需要一个操作数据库的类,

2.创建UriMatcher对象以及数据库操作对象,在增删改查的时候回从调用端传递Uri对象过来,在ContentProvider的增删改查的函数里,我们需要根据该uri来判断,是要操作一条数据,还是操作所有符合条件的数据

我们可以用个contentProvider知道数据的变化,使用registerContentObserver来注册一个观察者实例,当指定的uri发生改变时候,该实例会回调实例对象进行相应处理,这个特性尤其是不同进程之间的数据传输特别管用,因为sharepreference对于不同进程之前的数据的支持是非常糟糕的

class NotificationObserver extends ContentObserver {


    public NotificationObserver(Handler handler) {
        super(handler);
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {

        super.onChange(selfChange, uri);
        LogUtil.d("TAG", ">>>onchange uri=" + uri);
        String id = uri.getLastPathSegment();
        String queryValue = uri.getQueryParameter(PemometerConstant.CONTPROVIDER_URI_QUERY);
    }
}

注册的时候使用:

Uri notificationEnabledUri = Uri.parse("content://" + PedometerProvider.authory + "/notification/");
mNotificationObserver = new NotificationObserver(new Handler());
getContentResolver().registerContentObserver(notificationEnabledUri, true, mNotificationObserver);

发送通知的时候采用下面代码:

public static void notifyStepTargetChanged(Context context,int target) {
    LogUtil.d(TAG,"notifyStepTargetChanged target="+target);
    Uri uri = Uri.parse("content://com.babytree.apps.pregnancy.PedometerProvider/notification");
    Uri resultUri = ContentUris.withAppendedId(uri, target);
    ContentResolver resolver = context.getContentResolver();
    resolver.notifyChange(resultUri, null);
}

当调用resolver.notifyChange的时候,另一个线程中注册了这个uri的类就能接受到发送的uri了

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消