ContentProvider的数据一旦发生改变,程序就会调用如下代码:
getContext().getContentResolver().notifyChange(uri, null);
该代码通知所有监听在该Uri上的监听者,ContentProvider的数据发生了变化。
后面的例子,sms的ContentProvider发生变化,"content://sms"就为flag。
所以要想让其它程序监听你的变化,你就叫一声(getContext().getContentResolver().notifyChange(uri, null);),指定一个Uri,然后其它程序根据这个Uri注册监听,监听Observer的实现类要继承ContentObserver,然后重写里面的onChange()方法,就可自行操作了。
注册Uri监听者的代码如下:
registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
Parameters:
true
changes to URIs beginning with uri
will also cause notifications to be sent. If false
only changes to the exact URI specified by uri will cause notifications to be sent. If true, than any URI values at or below the specified URI will also trigger a match.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
resolver.registerContentObserver(uri, true, new MyObserver(new Handler()));
}
private class MyObserver extends ContentObserver{
public MyObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
Cursor cursor = resolver.query(uri, null, null, null, null);
cursor.moveToFirst();
System.out.println("-----------");
System.out.println("address:"+cursor.getString(2));
System.out.println("body:"+cursor.getString(cursor.getColumnIndex("body")));
System.out.println("-----------");
}
}
}