在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的基本使用方法相关推荐

  1. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  2. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  3. Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程

    参见 码云 协程使用方法一 (Dispatchers调度器模式) 指定不同线程.同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) withContext(Dispatchers ...

  4. IDEA中将代码块封装为方法,IDEA代码重构快捷键

    IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt + Shift + M Mac快捷键:Alt + Command + M 如图:

  5. IDEA自动生成对象所有set方法

    idea中有一款插件能够生成对象所有的set方法,GenerateAllSetter :下载地址 步骤1:将下载好的压缩包放在自己记得的文件夹中,在idea中进行导入 步骤2:在本地选中刚才的压缩包, ...

  6. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  7. java1.8新增超实用Map方法——Map.getOrDefault()和Map.value()方法详解

    1. Map.getOrDefault() 翻译一下官方解释: java.util.Map<K, V> V getOrDefault(Object key, V defaultValue) ...

  8. spring boot项目 中止运行 最常用的几种方法

    spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...

  9. Java Calendar.add()方法的使用,参数含义。指定时间差。

    cal.add()方法中的参数含义: 第一个参数如果是1则代表的是对年份操作,2是对月份操作,3是对星期操作,5是对日期操作,11是对小时操作,12是对分钟操作,13是对秒操作,14是对毫秒操作. 第 ...

  10. 设置select下拉框不可修改的→“四”←种方法

    设置select下拉框为不可修改的几种方法: 因为select的特殊性,导致它不能像input表单一样简单地设置一个readonly来限制修改,所以,我们需要进行别的操作! 1.为下拉框添加样式,可以 ...

最新文章

  1. Mysql创建数据库用户
  2. 【STM32】外部中断实验代码详解
  3. 【PTA】JAVA提交的一些注意点
  4. 经典递归——斐波那契数列,汉诺塔
  5. logging 日志输出乱码 info_接口自动化测试中logging实际用法
  6. Vertx编程风格:您的反应式Web Companion REST API解释了
  7. 字典:散列表、散列字典、关键字列表、集合与结构体
  8. javascript的id、class、元素选择器
  9. 获取python脚本的返回值_Python多线程获取返回值代码实例
  10. 西南科技大学OJ题 Delete Numbers 0700
  11. 如何快速提交网站备案 ICP备案
  12. RS-485 通讯协议简介
  13. ACCESS-入门思维导图
  14. 系统日常维护(电脑系统)
  15. 代码编辑器CodeMirror及其简单的配置
  16. 计算机最大化快捷键,最大化窗口快捷键,mac窗口最大化快捷键
  17. python判断闰年和平年
  18. prometheus+grafana监控rabbitmq
  19. 亲影:您的相册需要一个专属管家
  20. 业务员应熟记的应酬劝酒词大全

热门文章

  1. :没有此sdk或暂不支持此sdk模拟_即构SDK7月迭代:新增支持按通道设置延迟模式,大大减少卡顿...
  2. 牛b硬件信息修改大师_比X大师更靠谱?一款真正良心的硬件检测工具
  3. php 五子棋源联机版_五子棋服务器客户端联机对战 C++版完整代码
  4. javascript createelement_如何创建与框架无关的JavaScript插件
  5. 小程序素材抓取软件_小程序上新丨2020冬季产品图库更新,海量素材随你用!...
  6. java关联查询实战_MyBatis初级实战之六:一对多关联查询
  7. 自动驾驶_高精地图与车辆协同
  8. ExtremeC3Net: 使用高级C3模块的极轻量人像分割模型
  9. node.js(三)MongoDB数据库搭建
  10. RGPNET: A real-time general purpose semantic segmentation(复杂环境下实时通用语义分割网络)