一、广播接收器
1、使用new-other-broadcast receiver来创建一个广播接收器
2、重写onReceiver方法来编写监听执行逻辑
3、在文件清单中注册的广播接收器(AndroidStudio自动生成)中添加过滤器(即监听的广播),确定器所监听的广播
在
4、在主活动中实例化一个IntentFilter来声明可接收的广播
例如Intent filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED)
5、使用registerReceiver来注册一个接收器,使其可以接收广播,参数分别是广播接收器类和上面实例化的IntentFilter
二、短信监听的实现思路
1、使用广播接收器来实现
a、接收短信的动作是android.provider.Telephony.SMS_RECEIVED
b、这种方法实现起来较为简单且直观,不受活动的生命周期限制
c、这种方法有可能受到不同的机型影响,结果不同
在安卓9虚拟机上后台运行或退出均可监听,在华为mate系列安卓10设备测试在活动状态和后台可以监听
d、这种方式有可能受到其他软件显示,假如其他软件受到广播并取消了广播,则无法完成监听操作
2、使用服务检测短信数据库
a、在项目中创建一个新的服务
b、创建一个继承于ContentObserver的类,并重写onChange函数。在Uri对应数据库发生改变时会回调该函数
c、在创建的服务类中实例化一个上面创建的类,并实例化一个Uri
d、使用getContentResolver().registerContentObserver()方法注册观察者。
该方法有三个参数,第一个参数和第三个参数分别是实例化的Uri和创建继承于ContentObserver的类,第二个方法代表是否精确匹配,当时flase时是精确匹配,为true时还可以匹配Uri的派生类
e、这种方式在收到短信时会回调多次onChange方法,需要进行人工筛选
f、经测试,两种方式在没有其他应用干扰的情况下,效果是类似的
| 遇到的问题 | 详细说明 | 出现原因及解决 |
|---|---|---|
| 找不到getContentResolver方法 | 找不到方法,无法实现观察者注册 | 需要一个对应的上下才能够执行,没有办法直接执行getContentResolver方法解决方案:调用上下文对应的getContentResolver方法即可,如this.getContentResolver或getApplicationContext().getContentResolver() |




