使用 ContentObserver 监听短信接收 onChange 方法调用两次
2017-12-05 17:55
429 查看
原来我是用 BroadcastReceiver 来监听短信的接收,后来了解到用 ContentObserver 也能实现这种功能,而且还更方便。于是就尝试使用这种方法。
ContentObserver的原理是观察(捕捉)特定 Uri 引起的数据库的变化,继而可以做一些相应的处理。
在使用 ContentObserver 监听短信的过程中,发现了一个问题,问题描述如下:当手机接收到短信的时候, onChange 方法调用了一次,当打开短信App后,onChange方法又调用了一次。这样一来就调用了两次 onChange。
我们一般都不希望它调用两次,比如目前市场上的手环类App一般都具有短信提醒功能,只要手机接收到短信,手环App就会发送某些指令到手环上,手环收到指令进行振动提醒。实现的思路一般是在 onChange方法中发送数据到手环。假如出现了上述的问题,出现的结果是,手机接到短信后,手环振动一下,打开短信App,手环又振动一下。
经过一番查询。找到了解决的方法。
使用方法:
ContentObserver的原理是观察(捕捉)特定 Uri 引起的数据库的变化,继而可以做一些相应的处理。
在使用 ContentObserver 监听短信的过程中,发现了一个问题,问题描述如下:当手机接收到短信的时候, onChange 方法调用了一次,当打开短信App后,onChange方法又调用了一次。这样一来就调用了两次 onChange。
我们一般都不希望它调用两次,比如目前市场上的手环类App一般都具有短信提醒功能,只要手机接收到短信,手环App就会发送某些指令到手环上,手环收到指令进行振动提醒。实现的思路一般是在 onChange方法中发送数据到手环。假如出现了上述的问题,出现的结果是,手机接到短信后,手环振动一下,打开短信App,手环又振动一下。
经过一番查询。找到了解决的方法。
使用方法:
// 获取 ContentResolver mContentResolver = getContentResolver(); // 注册ContentObserver ,第一个参数是 Uri,第二个参数如果为 true,则该Uri的派 生 Uri(比如 “content://sms/ inbox”)也可以监听,第三个参数是一个ContentObserver。 mContentResover.registerContentObserver(Uri.parse("content://sms"), true, new SmsContentObserverr(new Handler())); // SmsContentObserver 继承 ContentObserver: class SmsContentObserver extends ContentObserver{ private Uri mUri; public SmssReciever(Handler handler) { super(handler); } // 只要 “content://sms” 里面的数据发生了变化就会调用该方法 public void onChange(boolean selfChange,Uri uri){ super.onChange(selfChange,uri); Log.e("onChange","selfChange = "+selfChange+", Uri = "+uri.toString()); // 接收短信后,然后再打开短信 App 后,两次的 Log 信息: // selfChange = false, Uri = content://sms/2750 收到短信后调用的 // selfChange = false, Uri = content://sms/inbox 打开了短信 App 后调用的 // 第一遍 先执行 content://sms/raw // 第二遍则是 content://sms/inbox if (uri.toString().equals("content://sms/inbox")) { // return 后就不会执行发送数据到手环的代码了 return; } // 发送数据到手环的代码 …… } }
相关文章推荐
- Android使用ContentObserver监听数据库变化,截取系统通知用户接收到短信
- Android使用ContentObserver监听数据库变化 接受指定号码的短信,并且不让系统截取到通知用户
- 关于使用ContentObserver监听不到删除短信会话的解决方案
- Android 使用ContentObserver监听短信的变化,并发送信息给特定的手机号码
- (转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案
- 使用ContentObserver监听短信
- 网上 eventObserver 示例 onchange 方法会多次调用
- Android使用ContentObserver监听数据库变化 接受指定号码的短信,并且不让系统截取到通知用户
- Android 编程技巧之 ----- 解决短信监听 onChange 触发两次的问题
- 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。
- 使用ContentObserver监听短信
- (转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案
- 使用ContentObserver监听短信数据库的变化
- RadioGroup调用check(int)方法时,onCheckedChanged方法被执行两次
- Android使用ContentObserver监听数据库变化
- android开发 Activity的里面调用两次 setContentView方法
- 使用ContentObserver监听事件变化并及时刷新列表效果
- 使用ContentObserver监听数据库变化
- 监听发送短信(Service中注册ContentObserver)
- (转)Android使用ContentObserver监听数据库变化