[android] 内容观察者
2023-02-18 15:47:14 时间
拦截短信,比如当发短信的时候,就把短信读取出来,当系统的短信发生变化的时候,大叫一声,把数据发送到公共的消息邮箱里面,我们的应用通过内容观察者观察公共的消息邮箱
获取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
系统的很多应用进行通知通信都是通过这个公共消息邮箱机制来实现的
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(); } } }
相关文章
- jwt 小程序接口鉴权 【firebase 6.x】
- 微信小程序用户隐私保护协议填写范本
- 论文解读(BYOL)《Bootstrap Your Own Latent A New Approach to Self-Supervised Learning》
- iOS小技能:敏感逻辑的保护方案
- iOS小技能:【intercept the HTTP/HTTPS requests 】利用NSURLProtocol 拦截请求
- iOS小技能:UIWebView 被拒的解决方案(用更安全的WKWebView替代UIWebView)
- iOS小技能:打包注意事项(私有API检测)
- iOS抽奖转盘上篇:概率抽奖算法 & 转盘算法 &轮盘边框动画丨(内含完整Demo)
- Android平台GB28181接入模块技术接入说明
- iOS 离线发表博客的 APP MWeb
- Android平台GB28181设备接入模块分辨率发生变化怎么办?
- Android Camera2 Focus Distance
- 小程序化正在成为大势所趋?
- 小程序化正在成为线上教育服务的最佳方式
- 技术干货|如何借助FinClip实现小程序在硬件设备上的运行
- Jitpack发布Android库出现Direct local .aar file dependencies are not supported when building an AAR
- 关于Android12安装apk出现-108异常INSTALL_PARSE_FAILED_MANIFEST_MALFORMED的解决方法
- Android 多module情况下module依赖aar问题处理
- Android7.0以上的分享图片文件错误及解决方法
- Android开发 对接微信分享SDK总结