继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

nickcau
关注TA
已关注
手记 114
粉丝 6509
获赞 303

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了

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP

热门评论

什么情况下app需要使用到不同进程的情况呢?

查看全部评论