ContentProvider实现IPC

ContentProvider作为专门为不同的应用之间进行数据共享的组件。IPC简直就是它的专业。

1,ContentProvider可以用来做什么
ContentProvider提供了访问本地应用程序的数据库的办法,它对外提供了几个接口,让想获得这些数据的其他应用程序去实现。
而如果没有ContentProvider,试想下怎么获取这些数据,不同的应用处于不同的进程,我们自己去操作的话,往往会很复杂。而android系统很贴心,为我们提供了ContentProvider。

获取什么数据呢。比如:手机里视频,音频,通讯录,图片等。

2,一个ContentProvider例子
实现目标:通过ContentProvider访问本地我自己创建的数据库。

继承ContentProvider,创建自己的内容提供者
xml文件中注册provider

    <provider
        android:exported="true"//true表示允许不同进程的组件访问
        android:authorities="asule.myhope.MyContentProvider"
        android:name=".MyContentProvider"/>

要知道的是每一个ContentProvider都会为自己的数据集提供一个唯一的Uri。
Uri的组成:标准前缀+authorities的值+path
标准前缀:content://,前缀永远是这个,无法改变
authorities:唯一标识provider,为了唯一,通常写为“包名+类名”
path:自己定义的路径

继承ContentProvider,会复写几个抽象方法。

onCreate不必多说,第一次使用provider时就会调用。
getType,返回的是一个Uri请求所对应的MIME类型。一般都不关注这个方法,返回null即可。
还有就是CRUD,增删改查的四个方法。

定义一个Uri匹配器,并为这个匹配器添加一些规则。

    //匹配器
    private static UriMatcher mather=new UriMatcher(UriMatcher.NO_MATCH);
    private static String authorities="asule.myhope.MyContentProvider";
    //添加一组规则
    static{
        mather.addURI(authorities,"insert",0);
    }
public Cursor query(Uri uri, String[] projection, String selection, 
                    String[] selectionArgs, String sortOrder) {
        if(mather.match(uri)==0){
            SQLiteDatabase db=sqlLite.getReadableDatabase();
            Cursor cursor=
                        db.query("asule",projection,selection,selectionArgs,null,null,sortOrder);
            return cursor;
        }
        return null;
    }

为匹配器添加规则(addURI)后,在query查询方法中,需要对传入的匹配器进行判断。匹配成功,就会把我们创建的数据库的游标返回。
(只要应用中注册了内容提供者,应用一旦启动,该内容提供者就会被创建),会打印下面的句子:

ActivityThread: Pub asule.myhope.MyContentProvider: asule.myhope.MyContentProvider

而在另一个应用里:

        ContentResolver contentResolver=getContentResolver();
        Uri uri=Uri.parse("content://asule.myhope.MyContentProvider/insert");
        Cursor cursor=contentResolver.query(uri, null, null, null, null);
        while (cursor.moveToNext()){
            String name=cursor.getString(cursor.getColumnIndex("name"));
            String phone=cursor.getString(cursor.getColumnIndex("phone"));
            System.out.println("name:"+name+"phone:"+phone);
        }

ContentResolver可以理解为一种代理(),无论是访问手机里的各种数据,还是访问前面所说的自己创建的数据库。真实对象的实现原则肯定是一样的,只是不知道你的数据集的Uri是什么。

contentResolver.query(uri, null, null, null, null);
就会调用ContentProvider的query。
uri和匹配规则可以匹配,就会暴露出数据库的真面目。返回Cursor后,我们就可以在另一个应用(进程)里获得数据库的数据。
这样就通过ContentProvider实现了数据共享。

ContentProvider中有CRUD等方法,也可以认为ContentProvider的底层结构其实是SQLite数据库。但是别忘了,通过ContentProvider也可以访问视频,音频,文件。而这些也表明ContentProvider还支持文件数据。
那怎么通过ContentProvider访问文件数据?
还是一个原则,如果Uri匹配,我们可以把文件数据的引用返回给外界。
android系统的MediaStore功能就是文件系统的ContentProvider。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值