一、前言
在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