eg:
1、定义Uri
public static Uri KEY_BROWSER_URI = Uri.parse("content://com.android.browser.provider.search_engine/search_engine");
2、new 一个ContentObserver
- private ContentObserver mBrowserObserver = new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- if (KEY_BROWSER_URI.equals(uri)) {
- isBrowserSogouSearch = CommonUtils.isBrowserSogouSearch();
- }
- }
- };
3、监听
- ContentResolver resolver = IMEContext.getContext().getContentResolver();
- resolver.registerContentObserver(KEY_BROWSER_URI, true, mBrowserObserver);
4、取消监听
- ContentResolver resolver = IMEContext.getContext().getContentResolver();
- resolver.unregisterContentObserver(mBrowserObserver);
ContentObserver 目的是观察(捕捉)特定 Uri 引起的数据库的变化, 继而做一些相应的处理。它类似于数据库技术中的触发器(Trigger),当 ContentObserver 所观察的 Uri 发生变化时,便会 触 发 它 。 触 发 器 分 为 表 触 发 器 、 行 触 发 器 , 相 应 地 ContentObserver 也 分 为 “ 表“ContentObserver、“行”ContentObserver,当然这是与它所监听的 Uri MIME Type 有关的。
注册 ContentObserver 方法
public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
功能:为指定的 Uri 注册一个 ContentObserver 派生类实例,当给定的 Uri 发生改变时,回调该实例对象去处理。
参数: uri 表示需要观察的 Uri
notifyForDescendents为false表示精确匹配,即只匹配该Uri。为true表示可以同时匹配其派生的 Uri。
取消注册 ContentObserver 方法
public final void unregisterContentObserver(ContentObserver observer)
功能:取消对给定 Uri 的观察
参数: observer ContentObserver 的派生类实例
ContentObserver 类介绍
构造方法 ContentObserver(Handler h)
void onChange(boolean selfChange) 功能:当观察到的 Uri 发生变化时,回调该方法去处理。所有 ContentObserver 的派生类都需要重载该方法去处理逻辑。
观察特定 Uri 的步骤如下
1、创建我们特定的 ContentObserver 派生类,必须重载父类构造方法,必须重载 onChange()方法去处理回调后的功能实现
2 、 利 用 context.getContentResolover() 获 ContentResolover 对 象 , 接 着 调 用registerContentObserver()方法去注册内容观察者
3、 在不需要时,需要手动的调用 unregisterContentObserver()去取消注册。
例子:监听短信内容变化
- public class Day0108_contentobserverActivity extends Activity{
- private Handler handler = new Handler() {
- public void handleMessage(android.os.Message msg) {
- switch (msg.what) {
- case 100:
- String body = (String) msg.obj;
- TextView tv = (TextView) findViewById(R.id.tv);
- tv.setText(body);
- break;
- }
- }
- };
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ContentResolver cr = getContentResolver();
- ContentObserver smsObserver = new
- SmsContentObserver(this, handler);
- //第二个参数,true 表示观察所有有关短信的
- cr.registerContentObserver(Uri.parse("content://sms"),
- true, smsObserver);
- //content://sms/inbox //收件箱
- //content://sms/sent //已发送
- //content://sms/draft //草稿箱
- //content://sms/outbox //发件箱
- //content://sms/failed //失败短信
- //content://sms/queued //代发队列
- }
- }
-
- //SmsContentObserver 代码如下:
- public class SmsContentObserver extends ContentObserver {
- private Handler handler;
- private Context context;
-
- public SmsContentObserver(Context context, Handler
- handler) {
- super(handler);
- this.handler = handler;
- this.context = context;
- }
-
- @Override
- public void onChange(boolean selfChange) {
- ContentResolver cr = context.getContentResolver();
- Cursor c = cr.query(Uri.parse("content://sms/inbox"),
- null, "0", null, "date desc");
- StringBuilder sb = new StringBuilder();
- while (c.moveToNext()) {
- //发件人手机号码
- String sendNumber = c.getString(c.getColumnIndex("address"));
- //信息内容
- String body = c.getString(c.getColumnIndex("body"));
- //readType 表示是否已经读
- int hasRead = c.getInt(c.getColumnIndex("read"));
- if (hasRead == 0) {//表示短信未读
- System.out.println("短信未读" + sendNumber);
- }
- sb.append(sendNumber + ":" + body + "\n");
- }
- handler.obtainMessage(100, sb.toString()).sendToTarget();
- }
- }
参考:https://blog.csdn.net/xiaopihair123/article/details/53149776