Android(安卓)中的内容观察者ContentObserver
16lz
2021-01-26
ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于
数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。
使用ContentObserver 的时候2个重要方法。
(1)注册: public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)。
功能:为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。
(2)卸载: public final void unregisterContentObserver(ContentObserver observer)(2)卸载:
功能:取消对给定Uri的观察
下面是一个监听发信箱的Demo
首先是一个监听类:
package com.bsn.test;import java.net.URI;import java.net.URL;import android.app.Activity;import android.content.ContentProvider;import android.content.Context;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Handler;public class SMSContentObserver extends ContentObserver {private Context mContext;private Handler mhandler;public SMSContentObserver(Context context,Handler handler) {super(handler); mContext=context; mhandler=handler;} @Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);Uri outMMS=Uri.parse("content://sms/sent");Cursor c=mContext.getContentResolver().query(outMMS, null,null, null, "date desc"); if (c!=null) { System.out.println("the number is----"+c.getCount());StringBuilder sb=new StringBuilder();while (c.moveToNext()) { sb.append("发件人手机号"+c.getInt(c.getColumnIndex("address"))); sb.append("信息内容"+c.getString(c.getColumnIndex("body")));}c.close();mhandler.obtainMessage(2,sb.toString()).sendToTarget();}}}
(2)注册监听类的acitivity
package com.bsn.test;import android.app.Activity;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.widget.TextView;public class ObserverActivity extends Activity{private SMSContentObserver observer;private TextView numView;private TextView contentView;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.dotsaygan);observer=new SMSContentObserver(this, mHandler);numView=(TextView) findViewById(R.id.tv);contentView=(TextView) findViewById(R.id.tv1);registerContentObservers();}private void registerContentObservers() { Uri uri=Uri.parse("content://sms"); getContentResolver().registerContentObserver(uri, true, observer);}private Handler mHandler=new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case 2:String outbox=(String)msg.obj;contentView.setText(outbox);break;default:break;}}};}
最后别忘记了加入 读取消息的权限
更多相关文章
- 酷炫轮播广告
- Android(安卓)6.0 监听系统通知(Notification)
- android Studio与数据库SQLserver连接实现登录
- Android(安卓)9.0 的 recent 键/事件的拦截
- Android(安卓)Your content must have a ListView whose id attr
- android之activity跳转 窗口跳转
- Android实现短信验证码自动填写功能
- Android中常用的设计模式(一)
- Android(安卓)4.4 Kitkat Phone工作流程浅析(九)__状态通知流程