189 8069 5689

ContentObserver-创新互联

1. ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理.ContentObserver

1)注册ContentObserver方法

创新互联建站专业IDC数据服务器托管提供商,专业提供成都服务器托管,服务器租用,成都移动机房成都移动机房,成都多线服务器托管等服务器托管服务。
public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)

功能:为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。

uri表示需要观察的Uri

notifyForDescendents 为false 表示精确匹配,即只匹配该Uri。 为true 表示可以同时匹配其派生的Uri。

2)取消注册ContentObserver方法

public final void unregisterContentObserver(ContentObserver observer)

功能:取消对给定Uri的观察

参数: observer ContentObserver的派生类实例

2.ContentObserver类介绍

构造方法 ContentObserver(Handler h)

void onChange(boolean selfChange) 功能:当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑。

3.观察特定Uri的步骤如下:

1、创建我们特定的ContentObserver派生类,必须重载父类构造方法,必须重载onChange()方法去处理回调后的功能实现

2、利用context.getContentResolover()获ContentResolover对象,接着调用registerContentObserver()方法去注册内容观察者

3、在不需要时,需要手动的调用 unregisterContentObserver()去取消注册。

例子:监听短信内容变化

在Activity中:

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+"
");

        }

        handler.obtainMessage(100,sb.toString()).sendToTarget();

    }

}

文章标题:ContentObserver-创新互联
链接分享:http://cdxtjz.cn/article/gegod.html

其他资讯