ContentObserve的基本使用方法
在Android中有时候会用到对系统自带的数据的数据变化进行监听,例如接收短信,拨打电话等,我记得我以前是通过注册广播来进行短信的监听的,可以通过设置广播action=“android.provider.Telephony.SMS_RECEIVED”,然后把广播的优先级设置成最高的,这样可以在接收到广播后根据意向决定是否需要拦截短信。只是这个过程对于我只想知道短信变化了没有,谁发来的,这点信息来说感觉有些麻烦了。
不过今天我接触到了ContentObserve这个类,他是系统提供的一个内容监听者,他可以很方便的帮我们监听例如短信的变化信息等,当然了,他并不能实现拦截短信的功能。
接下来我们来看一下这个类:
public abstract class ContentObserver
这是类的声明,很显然他是一个抽象类,我们想要使用它务必需要自己写个类来继承他
接下来我们看一下这个类中可以重写的方法:
public boolean deliverSelfNotifications() {return false;}public void onChange(boolean selfChange) {// Do nothing. Subclass should override.}public void onChange(boolean selfChange, Uri uri) {onChange(selfChange);}
说实话我只用到了第二个方法,对于一个方法API的解释里也只是说了返回值的true or false表示他是否对接收到的
self-change notifications
感兴趣,第三个方法API给出的解释是可以配合第二个方法使用,先调用第二个方法,然后在第二个方法中调用第三个方法,在第三个方法中来处理变化,如果感兴趣可以去看看源码,虽然我觉得没必要。
接下来直接上demo:
package com.example.contentobserve; import android.app.Activity; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.util.Log; public class MainActivity extends Activity {private MyContentObserver observer; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("ContentObserver","onCreate"); init(); }private void init() {Log.d("ContentObserver","init"); Uri uri = Uri.parse("content://sms/"); observer = new MyContentObserver(new Handler()); Log.d("ContentObserver","注册了短信的内容监听者"); //uri是你需要监听的内容提供者的uri,第二个参数代表是否接收你写的uri的派生uri的变化信息,第三个参数就是内容监听者了 getContentResolver().registerContentObserver(uri,true,observer); }class MyContentObserver extends ContentObserver {/** * Creates a content observer. * * @param handler The handler to run {@link #onChange} on, or null if none. */ public MyContentObserver(Handler handler) {super(handler); }@Override public void onChange(boolean selfChange) {Log.d("ContentObserver","短信改变了"); Uri uri = Uri.parse("content://sms/outbox"); Cursor cursor = getContentResolver().query(uri,new String[]{"_id","body","address"}, null,null,"_id desc");//查询发件箱中的短信,只要最新的 if(cursor != null && cursor.moveToFirst()) {String body = cursor.getString(cursor.getColumnIndex("body")); String address = cursor.getString(2); Log.d("ContentObserver","body = "+body+";address = "+address);//打印获取到的短信内容 }cursor.close();//游标使用后关闭 }}@Override protected void onDestroy() {super.onDestroy(); Log.d("ContentObserver","解绑了短信的内容监听者"); getContentResolver().unregisterContentObserver(observer); } }
可以直接复制代码,运行,看看logcat输出。使用方法就是打开软件,让他在后台运行,然后发短信就可以了。
ContentObserve的基本使用方法相关推荐
- 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...
- Java面试题大全2021版
一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...
- Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程
参见 码云 协程使用方法一 (Dispatchers调度器模式) 指定不同线程.同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) withContext(Dispatchers ...
- IDEA中将代码块封装为方法,IDEA代码重构快捷键
IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt + Shift + M Mac快捷键:Alt + Command + M 如图:
- IDEA自动生成对象所有set方法
idea中有一款插件能够生成对象所有的set方法,GenerateAllSetter :下载地址 步骤1:将下载好的压缩包放在自己记得的文件夹中,在idea中进行导入 步骤2:在本地选中刚才的压缩包, ...
- List元素互换,List元素转换下标,Java Collections.swap()方法实例解析
Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...
- java1.8新增超实用Map方法——Map.getOrDefault()和Map.value()方法详解
1. Map.getOrDefault() 翻译一下官方解释: java.util.Map<K, V> V getOrDefault(Object key, V defaultValue) ...
- spring boot项目 中止运行 最常用的几种方法
spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...
- Java Calendar.add()方法的使用,参数含义。指定时间差。
cal.add()方法中的参数含义: 第一个参数如果是1则代表的是对年份操作,2是对月份操作,3是对星期操作,5是对日期操作,11是对小时操作,12是对分钟操作,13是对秒操作,14是对毫秒操作. 第 ...
- 设置select下拉框不可修改的→“四”←种方法
设置select下拉框为不可修改的几种方法: 因为select的特殊性,导致它不能像input表单一样简单地设置一个readonly来限制修改,所以,我们需要进行别的操作! 1.为下拉框添加样式,可以 ...
最新文章
- Mysql创建数据库用户
- 【STM32】外部中断实验代码详解
- 【PTA】JAVA提交的一些注意点
- 经典递归——斐波那契数列,汉诺塔
- logging 日志输出乱码 info_接口自动化测试中logging实际用法
- Vertx编程风格:您的反应式Web Companion REST API解释了
- 字典:散列表、散列字典、关键字列表、集合与结构体
- javascript的id、class、元素选择器
- 获取python脚本的返回值_Python多线程获取返回值代码实例
- 西南科技大学OJ题 Delete Numbers 0700
- 如何快速提交网站备案 ICP备案
- RS-485 通讯协议简介
- ACCESS-入门思维导图
- 系统日常维护(电脑系统)
- 代码编辑器CodeMirror及其简单的配置
- 计算机最大化快捷键,最大化窗口快捷键,mac窗口最大化快捷键
- python判断闰年和平年
- prometheus+grafana监控rabbitmq
- 亲影:您的相册需要一个专属管家
- 业务员应熟记的应酬劝酒词大全
热门文章
- :没有此sdk或暂不支持此sdk模拟_即构SDK7月迭代:新增支持按通道设置延迟模式,大大减少卡顿...
- 牛b硬件信息修改大师_比X大师更靠谱?一款真正良心的硬件检测工具
- php 五子棋源联机版_五子棋服务器客户端联机对战 C++版完整代码
- javascript createelement_如何创建与框架无关的JavaScript插件
- 小程序素材抓取软件_小程序上新丨2020冬季产品图库更新,海量素材随你用!...
- java关联查询实战_MyBatis初级实战之六:一对多关联查询
- 自动驾驶_高精地图与车辆协同
- ExtremeC3Net: 使用高级C3模块的极轻量人像分割模型
- node.js(三)MongoDB数据库搭建
- RGPNET: A real-time general purpose semantic segmentation(复杂环境下实时通用语义分割网络)