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();
            }
            
        }
    }
  • 相关阅读:
    python计算时间差的方法
    Apache Prefork、Worker和Event三種MPM分析
    nagios监控mysql
    linux安装nagios客户端
    简单易懂的snmpd.conf配置文件说明
    Linux基本监控项目
    python 2.0 s12 day5 常用模块介绍
    python2.0 s12 day4
    ubuntu常用系统命令
    ubuntu编译安装libimobiledevice,查看ios 日志
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5277312.html
Copyright © 2011-2022 走看看