一、ContentProvider、ContentObserver、ContentResolver介绍及其原理
1. ContentProvider
定义与作用: ContentProvider是Android系统中的一种组件,用于在不同的应用程序之间或应用程序内部的不同部分之间共享数据。 它提供了一种机制,允许一个程序访问另一个程序中的数据,同时保证了数据的安全性和一致性。ContentProvider将数据以类似数据库中表的形式暴露出来,外界通过URI来访问这些数据。
原理: ContentProvider通过定义一套标准的接口(如增删改查操作),允许外部应用或系统组件通过URI来访问和操作其提供的数据。 这些数据可以存储在SQLite数据库中,也可以以其他形式存储。 ContentProvider在AndroidManifest.xml文件中进行声明,并通过authorities(主机名/域名)来唯一标识,以便外部应用通过ContentResolver来访问。
2. ContentResolver
定义与作用: 它是访问ContentProvider的桥梁,通过ContentResolver可以实现对ContentProvider中数据的增删改查操作。 ContentResolver是Android中的一个类,用于按照一定规则访问ContentProvider提供的数据。 常用是getContentResolver().query(传入URI),获取cursor游标,进行查询
原理: Uri对象包含了操作的数据的位置和类型信息。 ContentResolver通过传入URI来定位要操作的数据,并提供了insert()、update()、delete()和query()等方法来执行相应的数据库操作。 ContentResolver通过调用ContentProvider中定义的方法来实现对数据的实际操作,并将结果返回给调用者。
ps:getContentResolver().notifyChange(uri, null);//通知第三方有数据URI的更新
3. ContentObserver
定义与作用: ContentObserver是一个抽象类,用于观察(捕捉)特定Uri引起的数据变化,并在数据变化时触发处理相应的逻辑。 当ContentObserver所观察的Uri发生变化时,便会触发它的onChange()方法。
原理: ContentObserver通过注册到ContentResolver上来观察特定Uri的变化。 当ContentProvider中的数据发生变化时,它会通过ContentResolver通知所有注册的ContentObserver。 ContentObserver在接收到通知后,会调用其onChange()方法来处理数据变化。 在onChange()方法中,开发者可以编写处理数据变化的逻辑,如更新UI等。
三者之间的关系
- ContentProvider 提供数据,定义了一套标准的接口供外部访问。
- ContentResolver 是访问ContentProvider的桥梁,通过它来实现对ContentProvider中数据的增删改查操作。
- ContentObserver 观察特定Uri的数据变化,并在变化时触发处理逻辑。它通常与ContentProvider结合使用,以实现数据的实时更新和同步。
二、使用示例
1. ContentProvider使用示例
假设有一个简单的ContentProvider用于管理用户信息,其定义如下:
public class UserContentProvider extends ContentProvider {
// 实现onCreate()、query()、insert()、update()、delete()和getType()等方法
// ...
}
在AndroidManifest.xml中声明该ContentProvider:
<provider
android:name=".UserContentProvider"
android:authorities="com.example.provider.user"
android:exported="true" />
外部应用可以通过ContentResolver来访问该ContentProvider中的数据,例如查询用户信息:
Uri uri = Uri.parse("content://com.example.provider.user/user");
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
// 处理查询结果
}
cursor.close();
2. ContentObserver使用示例
注册ContentObserver以观察短信内容变化:
private ContentObserver smsObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
// 处理短信内容变化,如更新UI等
Cursor cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, "date desc");
// ... 处理cursor中的短信数据
cursor.close();
}
};
// 将指定URI和Observer,注册到ContentObserver
ContentResolver resolver = getContentResolver();
resolver.registerContentObserver(Uri.parse("content://sms/inbox"), true, smsObserver);
// 在不需要时取消注册
resolver.unregisterContentObserver(smsObserver);
注意:上述示例仅为说明用途,实际开发中需要根据具体需求进行适配和修改。