内容监听者

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:
uri The URI to watch for changes. This can be a specific row URI, or a base URI for a whole class of content.

notifyForDescendents If 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.
如果该参数为true,假设注册监听的Uri为content://abc,那么Uri为content://abc/asd、content://abc/qwe/opi的数据发生改变时也会触发该监听器;如果参数设为false,假如监听的Uri为content://abc,那么只有content://abc的数据发生改变时才会触发监听器。

observer The object that receives callbacks when changes occur.


监听系统sms变化的例子:

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("-----------");
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值