内容提供者-内容观察者
这个标题怪怪的,对吧!
先是内容提供者,然后又来一个内容观察者
先回顾一下,前面呢,我们已经有了一个保存用户的的数据库,编写了一个UserProvider,接着我们又编写了一个测试的应用作为第三方应用,通过UserProvider获取到user里的内容。
笔记在这 内容提供者-自定义内容提供者
什么是内容观者者?
内容,观察者。我们应该可以想到观察者模式吧?
观察者,对象是内容。也就是内容发生变化的时候,要通知到监听内容变化的地方。
就是这么简单
内容提供者里的内容观察者应用场景
比如说我新截图,图片库里不就更新了嘛!而微信,QQ对此有监听,所以当媒体库里的图片变化时,你点击了加号,就会提示你如下图:
内容提供者的监听
以我们之前写的UserProvider为例子
@Nullable
@Override
public Uri insert(@NonNull Uri uri,@Nullable ContentValues values) {
int result = sUriMatcher.match(uri);
if(result == USER_ALL) {
SQLiteDatabase db = mUserDatabaseHelper.getReadableDatabase();
long id = db.insert(UserDatabaseHelper.TABLE_NAME_USER,null,values);
//通知更新,第一个参数是Uri,后面是观察者,这里用不上,所以不需要了。
//如果这里有需要在数据插入后相应的逻辑,可以直接写在后面,或者在观察者的回调里执行。
getContext().getContentResolver().notifyChange(uri,null);
return Uri.parse("content://com.sunofbeaches.provider/user/" + id);
} else {
throw new IllegalArgumentException("参数非法.");
}
}
如果有其他的应用插入数据,那么就会通知监听这个uri内容变化的地方。以上是插入和通知的地方。接下来我们还要整一个注册监听的地方。
我们打算在第三方应用里注册一个监听这个uri内容变化的代码。这跟QQ一样。你截图了,向媒体库里插入了新的图片,然后你的QQ得到了通知,用户想发图片时,给上图的提示。
插入数据的代码
public void insertUserData(View view) {
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://com.sunofbeaches.contentproviderdemo");
ContentValues values = new ContentValues();
values.put("sex","male");
values.put("user_name","BillGates");
values.put("age",59);
values.put("password","12341234123");
contentResolver.insert(uri,values);
}
有了前面的代码,我们可以插入数据,并且插入数据后,会通知监听我们所通知Uri的内容的观察者。
注册观察者
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册观察者
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://com.sunofbeaches.provider");
contentResolver.registerContentObserver(uri,true,new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.d(TAG,"用戶内容发生改变!");
}
});
}
运行结果:
把程序跑起来,然后点击添加用户数据,如下:
我们在第三方应用里注册一下观察者如下: