1.新建一个案例如下:

2. 不需要添加权限,同时这里布局文件不做修改,来到MainActivity,如下:

 package com.itheima.sendsmslistener;

 import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.database.ContentObserver;
import android.view.Menu; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler()));
} private class MyObserver extends ContentObserver{ public MyObserver(Handler handler) {
super(handler);
} @Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
System.out.println("短信的数据库变化了。");
//查询数据库。
}
}
}

3.布署程序到模拟器上,如下:

在系统联系人中添加一个联系人,发送短信给这个联系人,如下:

观察Logcat打印的日志,如下:

09-15 07:42:33.109: I/System.out(644): 短信的数据库变化了。
09-15 07:42:34.739: I/System.out(644): 短信的数据库变化了。
09-15 07:42:35.189: I/System.out(644): 短信的数据库变化了。

     我们输入一条短信发送,会打印三条日志,也就是说onChange()方法被调用了3次,也就是说数据库改变了3次,为什么我们输入发送一条短信,数据库改变3次?

答:这是因为,我们发送短信,短信会经过3种状态:" 草稿 " ---> " 发送中 " ---> " 已发送 ";

(1)当我们编辑完短信,短信形成草稿,在数据库中存在标记字段,这个标记字段标记为某个数字或者字符(含义是短信是草稿),这个时候数据库变化,调用一次onChange()方法

(2)形成草稿的短信  要发送,数据库相应标记字段又要变化(含义短信正在发送),这个时候数据库变化,再次调用一次onChange()方法;

(3)短信发送成功之后,此时短信标记为已发送,这个时候数据库变化,最后一次调用onChange()方法;

这样出现了3次调用onChange()方法

最新文章

  1. JavaScript:Location
  2. sql笔记-group by 统计功能
  3. iOS 为iPhone和iPad创建不同的storyboard
  4. js 技巧和细节
  5. mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)
  6. jq获取绝对定位与相对定位的top, left值
  7. 我的WebService入门
  8. 部署搭建 Saltstack(centos6.6)
  9. WIN7下使用VC2010调试uCOS-II 2.91
  10. jdk+myeclipse配置安装相关步骤
  11. [ZZ] cbuffer和tbuffer
  12. Zend Studio / Ecliplse插件StartExplorer
  13. SQL Server调优系列进阶篇 - 深入剖析统计信息
  14. 处理Google Play的相关方法
  15. svg动画学习
  16. swfupload多图上传插件(ASP.NET)
  17. 【LaTeX排版】LaTeX论文排版<三>
  18. QPushButton class
  19. 从 0 → 1,学习Linux该这么开始!
  20. CentOS安装和配置Docker和Nginx

热门文章

  1. XML简单介绍及举例
  2. bzoj3272: Zgg吃东西&&3267: KC采花
  3. YTU 2416: C语言习题 成绩输出
  4. Remove '@override' annotation解决办法
  5. 将多个jar合并为一个jar
  6. 最好的6个Go语言Web框架
  7. get与post提交方式区别?
  8. angularJs 之deferred
  9. bzoj 1640||1692: [Usaco2007 Dec]队列变换【后缀数组】
  10. bzoj 4070: [Apio2015]雅加达的摩天楼【spfa】