博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ContentObserver
阅读量:4837 次
发布时间:2019-06-11

本文共 3058 字,大约阅读时间需要 10 分钟。

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

1)注册ContentObserver方法

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+"\n"); } handler.obtainMessage(100,sb.toString()).sendToTarget(); }}

转载于:https://www.cnblogs.com/feike/archive/2013/01/08/2851821.html

你可能感兴趣的文章
rem,em,px
查看>>
《TCP/IP 详解 卷1:协议》第 10 章:用户数据报协议
查看>>
前端学数据库之基础操作
查看>>
python模块pymysql
查看>>
Kafka与.net core(三)kafka操作
查看>>
jplayer.js 与 video.js
查看>>
Ubuntu mysql
查看>>
confluence-工具安装
查看>>
scrapy实战6爬取IT桔子国内所有融资公司:
查看>>
最小二乘法拟合直线
查看>>
1897. tank 坦克游戏
查看>>
57.二叉树的下一个节点——剑指offer
查看>>
angular.js ngbind nghtml ngTemplate
查看>>
nginx + rtmp 搭建流媒体服务器
查看>>
DAY-9 Linux基础及常用命令(5)
查看>>
unittest-mock-from-import
查看>>
node入门学习(二)
查看>>
通过js禁止输入空格(试用场景:当用字符串拼接插入dom节点时,onkeyup这些方法都不好使可用这个)...
查看>>
Codeforces Edu Round 48 A-D
查看>>
Sql-基础知识
查看>>