一、前言                                                                                     

        在Android平台中,各个Android 应用中可能需要互相传递数据。而ContentProvider类的作用就是在不同的应用之间进行数据的传递。

 

二、URI简介                                                                                

       URI在AndroidContentProvider中很重要,URI类似于网络中的URL,是一条字符串用于保存信息,或保存信息的地址。

   对于一个URI:

content://com.milkz.providers.mytest/messages
Uri uri = Uri.parse(content://com.milkz.providers.mytest/messages);
 
content://    <----   Android中规定的部分书写,类似于URL中的HTTP
com.milkz.providers.mytest <------ 该部分为AndroidContentProvider的authorities。继承自ContentProvider的
类的包的路径。
messages <------ 访问的数据


 

三、ContentProvider简介                                                          

       ContentProvider需要自定义一个Class去继承(有的公司API可能会把ContentProvider改成一个abstract,此时就需要使用者灵活改变了),假设这个自定义的类名为myContentProvider,这个定义的类的作用就是为了向其他应用提供信息的类。类似于给BroadCastReciver发送广播通知的系统广播,myContentProvider就是向外散发一个信息,然后对它感兴趣的类会去获取这个信息。ContentProvider向外发送的信息主要通过URI来发送,将一些信息封装在URI中,发送出去。

       继承于ContentProvider的类需要重写(有的公司的API修改了Google原生代码,可能就是实现接口了)

【ContentProvider中的六个方法】

        boolean onCreate()

和activity、service一样,ContentProvider也需要一个onCreate()来对数据进行初始化,但是在该方法中,同样不可进行大量的逻辑运算,防止造成线程阻塞。但是onCreate只会启动一次。该方法会在ContentProvider创建的时候被调用,当其他应用第一次访问时,ContentProvider会被创建并且会调用该方法。

        public Uri insert(Uri uri,ContentValues values) 

uri:消息封装的uri

values:该URI对应的值

用于向URI中插入消息

        public int delete (Uri uri,String selection,String[] selectionArgs)

删除某条消息

public int update(Uri uri,ContentValues values,String selection,Stringp[] selectionArgs)

更新消息

        public Cursor query(Uri uri,String[] projection ,String selectiion,String[] selectionArgs,String sortOrder)

类似于对数据库的操作,使用游标对数据进行一系列操作。通过获取游标来读取URI中的内容

        public String getType(Uri uri)

返回当前uri所代表的数据MIME类型。

字符串以 vnd.android.cursor.dir/ 开头: 该URI包含多条记录

字符串以 vnd.android.cursor.item/ 开头: 该URI只包含一条记录

 

四、ContentResolver                                                               

       ContentProvider是发送URI,对应的ContentResolver是用来接收信息并进行处理的,相比之下,ContentResolver并不需要太多的操作,直接在Content中使用getContentResolver() 来获取默认的ContentResolver对象。

         该对象直接操作URI对应的ContentProvider中的方法,故它属于单例模式。一个Android源码中有大量的COntentProvider和ContentResolver,而URI就是连接对应的Provider和Resolver的利器。

五、在Androidmanifest中配置                                                 

<provider
android:name=".myProvider"    <-----   类的名字
android:authorities="com.milkz.mYprovider"     <------ 类的包名
android:
android:exported="true" />     <-----   该ContentProvider是否可以被其他应用调用。

六、URI工具类                                                                       

1)UriMatcher <-----  判断该URI能否被当前的ContentProvider处理

void addURI(String authority,String path,int code)   

向URI中添加内容,也可以理解为注册URI,一个URI可以包含多个记录

authority+path = URI

  code : 标识码

int match(Uri uri)

返回URI匹配的标识码,如果找不到则返回-1

使用:

String s = content://com.milkz.providers.mytest/messages;
UriMatcher matcher = new uriMatcher(UriMatcher.NO_MATCH);
matcher.addURI(s,message,1);
int a = matcher.match(Uri.parce(s)); // a =1
matcher.addURI(s,message/#,1);//此处#代表任意的标识码
int b = matcher.match(Uri.parce(s/1));//b = 1

2) ContentUris <-----  操作Uri字符串的工具类

withAppendedld(URI uri,int id)

为uri加上id,即标识码

parseId(URI uri) 

从指定的uri中解析出id