ContentObserver 内容观察者
来源:互联网 发布:淘宝网首页打不开图片 编辑:程序博客网 时间:2024/05/17 00:50
监听某些特定数据的变化继而触发相应的操作,如监听某个表,或表中某一行的数据变化
Android提供了一个东西叫做ContentObserver,内容观察者,类似于数据库的触发器,使用如下:
①
创建一个ContentObserver的子类
class MyContentObserver extends ContentObserver
②
在构造方法中调用父类的构造方法
public MyContentObserver(Handler handler){ super(handler);}
③
重写父类的onChange(boolean selfChange)方法,当所监听的数据变化时,会回调这个方法
public void onChange(boolean selfChange) {... }
接着需要对我们的ContentObserver进行注册,需要先得到ContentResolver对象
this.getContentResolver().registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver observer);
uri:需要观察的uri;
notifyForDescendents: 值为true表示可以同时匹配派生的uri,比如:
Content://com.example.person/student,Content://com.example.person/student/#;
值为false表示精确匹配
取消对数据的监听可用如下语句:
this.getContentResolver().unregisterContentObserver(ContentObserver observer);
下面是一个对短信的监听简单例子:
SmsObserver:
package org.zjl.textcontentobserverimport android.content.ContentResolver;import android.content.ContentValues;import android.content.Context;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Handler;public class SmsObserver extends ContentObserver {private Context context;private Handler handler;public SmsObserver(Handler handler,Context context) {super(handler);this.handler = handler;this.context = context;}@Overridepublic void onChange(boolean selfChange) {ContentResolver resolver = ObserverApp.context.getContentResolver(); //查出短信表中最后修改的那条数据 Cursor cursor = resolver.query(Uri.parse("content://sms/"),null, null, null,"date desc");cursor.moveToFirst();if(cursor.getInt(cursor.getColumnIndex("type"))==1){//type==1表示收到的短信,2表示发送的短信System.out.println("收到"+cursor.getString(cursor.getColumnIndex("address"))+"消息");System.out.println(cursor.getString(cursor.getColumnIndex("body"))); //删除刚刚收到的短信 resolver.delete(Uri.parse("content://sms/"), "_id=?", new String[]{String.valueOf(cursor.getInt(0))});}else if(cursor.getInt(cursor.getColumnIndex("type"))==2) {System.out.println("发送给"+cursor.getString(cursor.getColumnIndex("address")));System.out.println(cursor.getString(cursor.getColumnIndex("body")));}cursor.close();}}
MainActivity:
package org.zjl.textcontentobserver;import android.app.Activity;import android.net.Uri;import android.os.Bundle;import android.widget.Toast;public class MainActivity extends Activity {SmsObserver smsObserver;Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);smsObserver = new SmsObserver(handler,MainActivity.this); Uri uri = Uri.parse("content://sms/");//需要被监听的短信数据表urithis.getContentResolver().registerContentObserver(uri, true, smsObserver);}@Overrideprotected void onDestroy() {this.getContentResolver().unregisterContentObserver(smsObserver);super.onDestroy();}}
- Android内容观察者--ContentObserver
- ContentObserver内容观察者
- ContentObserver 内容观察者
- Android -- ContentObserver 内容观察者
- ContentObserver(内容观察者)
- Android 中的内容观察者ContentObserver
- ContentObserver——内容观察者
- android下内容观察者: ContentObserver
- Android 中的内容观察者ContentObserver
- 内容观察者(ContentObserver)的使用~
- ContentObserver——内容观察者
- ContentObserver内容监听者(内容观察者)
- ContentObserver内容监听者(内容观察者)
- Android中内容观察者的使用---- ContentObserver
- android中ContentObserver——内容观察者
- android之ContentObserver内容观察者的使用
- Android自学笔记-13-ContentObserver内容观察者
- Android内容观察者 --ContentObserver(待写)
- apache启动失败:The requested operation has failed!
- 如何编码实现内存溢出
- maven 关于测试的配置
- 技术政治之借壳孵蛋
- lablebiew ole
- ContentObserver 内容观察者
- 获取文件当前目录
- Inventor 2014 API 新功能 (6) 插槽件(slot)草图
- 关于Android的XML文件解析器Pull解析方式事件类型的分析
- c++ 命令模式
- 读写STM32内部flash读写代码
- STM32 对内部FLASH读写接口函数
- 工厂设计模式
- 最近写DirectShow filter的一点经验【by : mem (Memory for ever)】