码迷,mamicode.com
首页 > 其他好文 > 详细

ContentProvider实现IPC

时间:2016-05-07 06:57:17      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

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。

ContentProvider实现IPC

标签:

原文地址:http://blog.csdn.net/u012834186/article/details/51335795

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!