ContentObserver内容监听者(内容观察者)

这里外加一个思维导图:关于ContentProvider



好了,现在来看看ContentObserver。


ContentObserver——内容监听者(内容观察者)。指的是监听某一指定路径里面的数据。目的是观察(捕捉)特定URI引起的数据库的变化,从而做一些相当应的处理。当数据一旦发生改变会通过调用onChange()方法,通过handler把数据发送出去。

   通过ContentObserver实现验证码自动填入的功能。首先我们需要在布局文件中写一个TextView控件。在主activity(ContentobserverActivity.Java)中拿到文本框控件,然后通过handler、bundle接收消息以及拿到数据后接收验证码等操作。具体代码如下:

    public class ContentobserviceActivity extends AppCompatActivity {  
        private TextView tv_contentobservice_content;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_contentobservice);  
            tv_contentobservice_content = (TextView) findViewById(R.id.tv_contentobservice_content);//拿到文本框的控件  
            Handler handler=new Handler(){//实列化handler,用来更新UI  
                @Override  
                public void handleMessage(Message msg) {//这个方法是用来接收消息  
                    super.handleMessage(msg);  
                    Bundle bundle=msg.getData();//从消息中拿到bundle  
                    tv_contentobservice_content.setText(bundle.getString("phone"));//在bundle中拿到数据  
                }  
            };  
            this.getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,new Mycontent(handler));//拿到SMS中的内容监听者(SMS是所有的消息,包括发件箱与收件箱...)  
      
        }  
        class Mycontent extends ContentObserver{//写一个类继承ContentObserver,重写它的方法  
           
            private Handler handler;  
            public Mycontent(Handler handler) {  
                super(handler);  
                this.handler=handler;  
            }  
    //当信息发生改变时调用onChange()方法  
            @Override  
            public void onChange(boolean selfChange) {  
                Log.i("test", "onChange: 主人来信息啦~~~");  
                Cursor cursor=ContentobserviceActivity.this.getContentResolver().query(Uri.parse("content://sms/inbox"),null,null,null,null);//查询系统数据库中的收件箱  
            if (cursor.moveToNext()){//判断是否有值  
                if (cursor.getString(cursor.getColumnIndex("address")).equals("+86************")){//如果值的号码为你所固定的号码  
                String date=cursor.getString(cursor.getColumnIndex("body"));//拿到你所固定的号码发送的内容  
                String data[]=date.split(":");//根据冒号开始切割  
                    String datas=data[1];//拿到冒号后的内容  
                    String phone=datas.substring(0,4);//因为内容后的数字为验证码,所有直接截取后四位的数据  
                    Message message=new Message();//实列化一个消息  
                    Bundle b=new Bundle();//实列化一个bundle  
                    b.putString("phone",phone);//把验证码放入bundle  
                    message.setData(b);//把bundle放入消息中  
                    handler.sendMessage(message);//通过handler发送消息  
            }    }  
                super.onChange(selfChange);  
            }  
        }  
    }  

配置的权限

  • !--访问短信的权限-->  
  •     <uses-permission android:name="android.permission.READ_SMS"/>  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值