ContentObserver——内容观察者

来源:互联网 发布:阿里妈妈 知乎 编辑:程序博客网 时间:2024/05/21 11:17

 

下面出处:http://blog.csdn.net/by317966834/article/details/7591451

ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于
   数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,
  相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。
           熟悉Content Provider(内容提供者)的应该知道,我们可以通过UriMatcher类注册不同类型的Uri,我们可以通过这些不同的
    Uri来查询不同的结果。根据Uri返回的结果,Uri Type可以分为:返回多条数据的Uri、返回单条数据的Uri。

  短信的Uri共有一下几种:
                         content://sms/inbox     收件箱         
                         content://sms/sent        已发送 
                         content://sms/draft        草稿           
                         content://sms/outbox    发件箱           (正在发送的信息)
                         content://sms/failed      发送失败     
                         content://sms/queued  待发送列表  (比如开启飞行模式后,该短信就在待发送列表里)

http://blog.csdn.net/wanglj0925/article/details/7599082

下面个人经验部分:
监听短信,并将获取的验证码自动填入待填区!
public class smsObserver   extends ContentObserver{

private  Context  mContext;
private  Handler  mHandler;

public smsObserver(Context mContext, Handler mHandler) {
super(mHandler);
this.mContext = mContext;
this.mHandler = mHandler;
}

@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
Log.e("DEBUG","SMS has  changed");

Log.e("DEBUG",uri.toString());

if(uri.toString().equals("content://sms//raw")){
return;
}

Uri inboUri=uri.parse("content://sms/inbox");

Cursor  c=mContext.getContentResolver().query(inboUri, null,
null, null, "date  desc");//按照日期倒序排列
if(c!=null){
if(c.moveToNext()){
String  address=c.getString(c.getColumnIndex("address"));
String  body=c.getString(c.getColumnIndex("body"));

Log.e("DEBUG","发件人为:"+address+"短信内容为:"+body);
Pattern p=Pattern.compile("\\d{6}");//匹配第一次出现的四位数字
Matcher m=p.matcher(body);

if(m.find()){
String  code=m.group(0);
Log.e("DEBUG","验证码"+code);
mHandler.obtainMessage(MainActivity.MSG_RECEIVE_CODE,code).sendToTarget();
}
}
c.close();
}
}
}


在主activity新建对象:并用handler更新UI,注意要在onPause中取消监听
   public  static  final  int  MSG_RECEIVE_CODE=1;
observer =new  smsObserver(MainActivity.this,handler);
Uri  uri=Uri.parse("content://sms");
getContentResolver().registerContentObserver
   (uri, true, observer);

@Override
protected void onPause() {
super.onPause();
getContentResolver().unregisterContentObserver(observer);
}
public  Handler  mHandler=new  Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==MSG_RECEIVE_CODE){
                 String  code=(String)msg.obj;
                 //更新UI
                 Toast.makeText(MainActivity.this, code+"66666666",Toast.LENGTH_SHORT).show();
}
}
};


0 0
原创粉丝点击