ContentProvider:内容提供者,进程间 进行数据交互 、共享、跨进程通信
ContentProvider 以表的形式将数据呈现给外部应用和其他进程,类似数据库的形式(当一个APP单一的进程占用内存过高是否考虑把一些功能,例如视频播放、乐音播放等功能放到另一个进程中)。
1.ContentProvider基本操作
// 外部进程向 ContentProvider 中添加数据
public Uri insert(Uri uri, ContentValues values)
// 外部进程 删除 ContentProvider 中的数据
public int delete(Uri uri, String selection, String[] selectionArgs)
// 外部进程更新 ContentProvider 中的数据
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
// 外部应用 获取 ContentProvider 中的数据
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
// ContentProvider创建后 或 打开系统后其它进程第一次访问该ContentProvider时 由系统进行调用
public boolean onCreate()
// 得到数据类型,即返回当前 Url 所代表数据的MIME类型
public String getType(Uri uri)
2.ContentProvider的几个东西
- 在系统中注册读内容提供者的权限
<permission
android:name="xxxxx.xxxx.permission.READ_CONTENT" //指定权限的名称
android:label="Permission for read content provider"
android:protectionLevel="normal"
/>
- URI :作为访问的标识(地址),content://Authority/Path、content://Authority/Path/Id
Authority:授权信息,用以区别不同的ContentProvider;
Path:表名;
id :id;
Uri uri = Uri.parse("content://xxxxx.xxxx./User/123")
3.ContentResolver(ContentProvider集群?代理?)
管理不同 ContentProvider,直接通过不同的URI操作不同的ContentProvider中的表
- ContentResolver基本操作
// 获得ContentResolver
context.getContentResolver();
// 外部进程向 ContentProvider 中添加数据
public Uri insert(Uri uri, ContentValues values)
// 外部进程 删除 ContentProvider 中的数据
public int delete(Uri uri, String selection, String[] selectionArgs)
// 外部进程更新 ContentProvider 中的数据
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
// 外部应用 获取 ContentProvider 中的数据
public Cursor query(Uri uri, String[] projection,
4.ContentUris类(操作Uril)
基本操作
//Uri追加ID
withAppendedId()
//Uri获取ID
parseId()
5.UriMatcher类(匹配Uri)
基本操作
//普通的初始化一下
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
matcher.addURI("xx.xx.xx", "uzi1", 1);
matcher.addURI("xx.xx.xx", "uzi2", 2);
//若 uri 为 :"content://xx.xx.xx/uzi1";
matcher.match(uri) = 1;
//若 uri 为 :"content://xx.xx.xx/uzi2";
matcher.match(uri) = 2;
6.ContentObserver类(内容观察者)
当ContentProvider 中的数据发生变化(增、删 、改)时,就会触发 ContentObserver类
// 注册内容观察者
ContentObserver getContentResolver().registerContentObserver(uri);
// 通知变化
public class UserContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
getContext().getContentResolver().notifyChange(uri, null);
}
}
// 注销观察者
getContentResolver().unregisterContentObserver(uri);