1. 实现原理图

2. 示例代码

(暂时有个问题,短信观察者 收到一条短信时 onchange方法会执行两次, 解决方法为:每次监听到变化的时候就去取最新短信的id,跟上次取的比较,如果一样的就不做处理,如果不一样,就该干嘛干嘛)

MainActivity.java

public class MainActivity extends Activity {

	public static final String TAG = "MainActivity";

	@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 监听系统的短信数据库的变化 ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
//true表示只要uri的前缀相同(content://sms/) 的数据有变化就会被发现
resolver.registerContentObserver(uri, true, new SmsObserver(new Handler())); } private class SmsObserver extends ContentObserver { public SmsObserver(Handler handler) {
super(handler); }
//当观察到数据发生变化的时候 会执行onchange方法.
@Override
public void onChange(boolean selfChange) {
Log.i(TAG,"发现有新的短信产生了...");
//1.利用内容提供者 中间人 获取用户的短信数据.
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/"); //根据分析 代表的是所有的短信的路径
Cursor cursor = resolver.query(uri, new String[]{"address","date","body","type"}, null, null, null);
if(cursor.moveToFirst()){
String address =cursor.getString(0);
String date = cursor.getString(1);
String body = cursor.getString(2);
String type = cursor.getString(3);
System.out.println(address+"--"+date+"---"+body+"---"+type);
}
cursor.close();
super.onChange(selfChange);
}
}
}

3. 怎么实现 ContentObserver

由原理图可知, 在dao层操作时 发信息到消息邮箱即可。

例如在数据库 插入操作时 发一条消息到邮箱,notifyChange的uri可以自己随意定,

third app使用的时候要保持uri一致。

public void add(String name, float money){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("insert into account (name,money) values (?,?)",
new Object[]{name, money});
db.close();
context.getContentResolver().notifyChange(uri, null);
}

Android -- ContentObserver 内容观察者的更多相关文章

  1. android ContentObserver内容观察者基本使用

    package com.example.observertest; import android.content.ContentResolver; import android.database.Co ...

  2. Android中内容观察者的使用---- ContentObserver类详解 (转)

    前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Conten ...

  3. 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)

    1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...

  4. Android 利用内容观察者实现短信窃听

    <Android 内容观察者的原理>中介绍了内容观察者的一些基本原理,并做了简单的实战,本文接着进一步做一个小项目实战 package com.wuyudong.smslistener; ...

  5. ContentObserver 内容观察者作用及特点

    eg: 1.定义Uri public static Uri KEY_BROWSER_URI = Uri.parse("content://com.android.browser.provid ...

  6. Android中内容观察者的使用---- ContentObserver类详解

    详解:http://blog.csdn.net/qinjuning/article/details/7047607

  7. Android ContentObserver详解

    前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Content ...

  8. Android 内容观察者的原理

    拦截短信,比如当发短信的时候,就把短信读取出来,当系统的短信发生变化的时候,大叫一声,把数据发送到公共的消息邮箱里面,我们的应用通过内容观察者观察公共的消息邮箱 获取ContentResolver对象 ...

  9. Android开发之内容观察者

    内容观察者: 当关注应用的数据库数据改变时,内容提供者会发出通知,在内容提供者的uri上注册一个内容观察者,就可以收到数据改变的通知 实现步骤: 1.假如是自定义的ContentProvider,需要 ...

随机推荐

  1. 爬虫之cookiejar模块

    简介 有时候我们需要爬一些需要登录才能进入网页,这个时候就要用到cookie相关的一些模块来操作了 内置的http包里包含了cookie相关的一些模块,通过她们我们可以自动使用cookie Cooki ...

  2. Swift学习——Swift基础具体解释(一)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/34807025 注:由于基础部分在Swi ...

  3. kettle部分传输场景应用(每个作业都实验过啦)

    不过都是全量的,没有增量的,增量的需要自行写脚本实现 1.mysql->mysql 2.ftp->mysql(整个文件夹下面读取) 3.hdfs->mysql 4.sftp-> ...

  4. JS片段大总结

    html中的标签都可以加一个id的属性. <body> <div id="tree" data-leaves="47" data-plant- ...

  5. 20165324 实验二《Java面向对象程序设计》实验报告

    20165324 实验二<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324 指导教师:娄嘉鹏 实验日期: ...

  6. mysql在线手册汇总

    1. MySQL官网 http://www.mysql.com/ • Reference Manual ▶ MySQL 5.0 Reference Manual:http://dev.mysql.co ...

  7. 在MFC里面实现线程的实例

    线程是一种从软件到硬件的技术,主要目的是为了提高运行速度,和多任务. ××××××××××××××××××××××××××××××××××××需要储备的资料(他人的)××××××××××××××××× ...

  8. Bootstrap 中的插件的学习2(导航)

    实例 在导航栏内 下面的实例演示了在导航栏内的下拉菜单的用法: <!DOCTYPE HTML> <html> <head> <link href=" ...

  9. XDU 1011

    解法1:TLE #include<stdio.h> int main() { long long n; //freopen("in.txt","r" ...

  10. XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem L. Canonical duel

    题目:Problem L. Canonical duelInput file: standard inputOutput file: standard outputTime limit: 2 seco ...