zoukankan      html  css  js  c++  java
  • [android] 内容观察者

    拦截短信,比如当发短信的时候,就把短信读取出来,当系统的短信发生变化的时候,大叫一声,把数据发送到公共的消息邮箱里面,我们的应用通过内容观察者观察公共的消息邮箱

    获取ContentResolver对象,调用函数getContentResolver()

    调用ContentResolver对象的registerContentObserver(uri,notifyForDescendents,observer)方法,参数:Uri对象,是否精确uritrue不精确,false精确),observer对象 ContentObserver对象

    因为ContentObservera抽象类,因此我们写一个内部类来继承这个抽象类,必须实现构造函数,构造函数的Handler对象消息处理器稍后会讲

    定义一个内部类MyObserver,实现父类的onChange()回调方法,观察到消息邮箱发生变化的时候会回调这个方法。

    在这个回调函数里面,使用获取到短信内容,取最后一条,调用Cursor对象的moveToFirst()指针指向最后一条

    这个应用也要加权限

    系统应用是如何发出这个叫声的呢,获取ContentResolver对象,通过getContentResolver()方法,调用ContentResolver对象的notifyChange(uri,observer)方法,参数:uri随便定义,observer指定谁处理默认null

    系统的很多应用进行通知通信都是通过这个公共消息邮箱机制来实现的

    package com.tsh.myobserver;
    
    import android.app.Activity;
    import android.content.ContentResolver;
    import android.database.ContentObserver;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Handler;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            //观察消息邮箱
            ContentResolver resolver=getContentResolver();
            Uri uri=Uri.parse("content://sms/");
            resolver.registerContentObserver(uri, true, new MyObserver(new Handler()));
        }
        //内部类实现内容观察者
        private class MyObserver extends ContentObserver{
    
            public MyObserver(Handler handler) {
                super(handler);
                // TODO Auto-generated constructor stub
            }
    
            @Override
            public void onChange(boolean selfChange) {
                // TODO Auto-generated method stub
                super.onChange(selfChange);
                Uri uri=Uri.parse("content://sms/");
                ContentResolver resolver=getContentResolver();
                String[] projection=new String[]{"address","date","type","body"};
                Cursor cursor=resolver.query(uri, projection, null, null, null);
                cursor.moveToFirst();
                String body=cursor.getString(cursor.getColumnIndex("body"));
                Toast.makeText(MainActivity.this, body, 1).show();
            }
            
        }
    }
  • 相关阅读:
    【AngularJS】学习资料
    Anaconda环境安装
    ORM表之间高级设计
    drf序列化和反序列化
    安装与使用django-restframework
    django-restframework
    顶象滑块验证码
    Restful接口规范
    Web API接口
    BBS配置
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5277312.html
Copyright © 2011-2022 走看看