目录
1 数据共享标准:ContentProvider
1.1 ContentProvider简介
ContentProvider 是 Android 中实现跨应用数据共享的一种方式。它可以包含一组公开的 URI,其他应用可以通过这些 URI 来操作 ContentProvider 中的数据。ContentProvider 可以用来读写数据库,访问文件系统,甚至访问网络等。
1.2 URI简介
URI (Uniform Resource Identifier) 是一种用来标识 ContentProvider 中数据的方式。在 ContentProvider 中,每一个表或者视图都有一个对应的 URI。比如,
content://com.example.app.provider/table1
可能对应于你的数据库中的一个表。
1.3 使用ContentResolver操作数据
ContentResolver 是用来操作 ContentProvider 中数据的主要接口。你可以通过 ContentResolver 的 query()、insert()、update()、delete() 方法来进行数据操作。以下是一个查询操作的例子:
Uri uri = Uri.parse("content://com.example.app.provider/table1");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, null, null, null, null);
2 开发ContentProvider
2.1 开发ContentProvider的子类
要创建一个 ContentProvider,你需要继承 ContentProvider 类,然后重写一些必要的方法,如 onCreate()、query()、insert()、update() 和 delete()。以下是一个简单的例子:
public class MyContentProvider extends ContentProvider {
@Override
public boolean onCreate() {
// 初始化你的 ContentProvider
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// 根据 uri 进行查询操作
return null;
}
// 其他的方法...
}
2.2 使用ContentProvider调用方法
其他应用可以通过 ContentResolver 来操作你的 ContentProvider。以下是一个查询操作的例子:
Uri uri = Uri.parse("content://com.example.app.provider/table1");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, null, null, null, null);
3 操作系统的ContentProvider
3.1 使用ContentProvider管理联系人
Android 系统提供了一个 ContactsContract ContentProvider,你可以通过它来读写联系人数据。以下是一个查询所有联系人的例子:
Uri uri = ContactsContract.Contacts.CONTENT_URI;
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, null, null, null, null);
3.2 使用ContentProvider管理多媒体
Android 系统也提供了 MediaStore ContentProvider,你可以通过它来访问设备上的多媒体数据。以下是一个查询所有图片的例子:
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, null, null, null, null);
4 监听ContentProvider的数据改变
你可以通过使用 ContentObserver 来监听 ContentProvider 的数据改变。以下是一个简单的例子:
Uri uri = Uri.parse("content://com.example.app.provider/table1");
ContentResolver resolver = getContentResolver();
ContentObserver observer = new ContentObserver(null) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// 当数据改变时,这个方法会被调用
}
};
resolver.registerContentObserver(uri, true, observer);
当你的 ContentProvider 中的数据发生改变时,所有注册到这个 URI 的 ContentObserver 都会收到通知。