前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[android] 内容观察者

[android] 内容观察者

作者头像
唯一Chat
发布2019-09-10 11:11:45
5270
发布2019-09-10 11:11:45
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地

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

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

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

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

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

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

这个应用也要加权限

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

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

代码语言:javascript
复制
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();
        }
        
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-03-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档