65.内容观察者

本文介绍了Android中的内容观察者机制,包括如何使用内容观察者监听系统短信数据库的变化,以及如何为自定义的内容提供者添加内容观察者支持。文章通过具体代码示例展示了实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内容观察者是观察内容提供者状态变化的,根据内容提供者的不同内容观察者分为了,观察系统的内容提供者和自定义的内容提供者

观察系统的内容提供者

package com.ldw.contentObserve;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //注册一个内容观察者,监听短信数据库内容的改变
        ContentResolver cr = getContentResolver();
        //第一个参数是监听哪一个内容提供者的通知,
        //第二个参数是true,只要以content://sms开通的uri数据的改变就能收到通知,模糊匹配
        cr.registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler()));
    }
    
    class MyObserver extends ContentObserver{

		public MyObserver(Handler handler) {
			super(handler);
			// TODO Auto-generated constructor stub
		}
		
		//收到数据改变的通知,此方法被调用
		@Override
		public void onChange(boolean selfChange){
			super.onChange(selfChange);
			System.out.println("短信数据库改变了");
		}
    	
    }


    
}

观察自定义的内容提供者,首先先定义一个内容提供者,这里以以前的案例为例创建一个内容提供者,在insert语句中添加内容观察者的语句

数据库改变以后,发送一个数据库改变的通知:

	//这个方法提供其他的方法调用,用于往po数据库中插入数据
	//values由其他的应用传入,封装需要被传入的数据,
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		//通过Uri匹配器匹配传入的Uri
		if(um.match(uri) == 1){
			db.insert("po", null, values);
			
			//发送数据库改变的通知
			//第一个参数是:通知发送到哪一个uri上,所有注册这一个uri的内容观察者都可以拿到这个数据库改变的通知
			getContext().getContentResolver().notifyChange(uri, null);
		}
		else if(um.match(uri) == 2){
			db.insert("go", null, values);
		}
		else{
			//在匹配器中没有匹配的就抛出异常
			throw new IllegalArgumentException("uri不在匹配器重");
		}
		
		return uri;
	}

创建一个APP来观察内容提供者状态的改变

package com.ldw.selfobvserve;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        getContentResolver().registerContentObserver(Uri.parse("content://com.ldw.po"), true, 
        		new ContentObserver(new Handler()){
        			@Override
        			public void onChange(boolean selfChange){
        				super.onChange(selfChange);
        				System.out.println("自定义的内容提供者的数据库改变了");
        			}
        		});
    }

    
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值