[android] 内容观察者

前端之家收集整理的这篇文章主要介绍了[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;
 android.content.ContentResolver;
 android.database.ContentObserver;
 android.database.Cursor;
 android.net.Uri;
 android.os.Bundle;
 android.os.Handler;
 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  ContentObserver{

        public MyObserver(Handler handler) {
            (handler);
             TODO Auto-generated constructor stub
        }

        @Override
        void onChange(boolean selfChange) {
             TODO Auto-generated method stub
            .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,1)">null,1)">null);
            cursor.moveToFirst();
            String body=cursor.getString(cursor.getColumnIndex("body"));
            Toast.makeText(MainActivity.this,body,1).show();
        }
        
    }
}

 

猜你在找的Android相关文章