Android -- ContentObserver 内容观察者
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 内容观察者的更多相关文章
- android ContentObserver内容观察者基本使用
package com.example.observertest; import android.content.ContentResolver; import android.database.Co ...
- Android中内容观察者的使用---- ContentObserver类详解 (转)
前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Conten ...
- 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)
1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...
- Android 利用内容观察者实现短信窃听
<Android 内容观察者的原理>中介绍了内容观察者的一些基本原理,并做了简单的实战,本文接着进一步做一个小项目实战 package com.wuyudong.smslistener; ...
- ContentObserver 内容观察者作用及特点
eg: 1.定义Uri public static Uri KEY_BROWSER_URI = Uri.parse("content://com.android.browser.provid ...
- Android中内容观察者的使用---- ContentObserver类详解
详解:http://blog.csdn.net/qinjuning/article/details/7047607
- Android ContentObserver详解
前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Content ...
- Android 内容观察者的原理
拦截短信,比如当发短信的时候,就把短信读取出来,当系统的短信发生变化的时候,大叫一声,把数据发送到公共的消息邮箱里面,我们的应用通过内容观察者观察公共的消息邮箱 获取ContentResolver对象 ...
- Android开发之内容观察者
内容观察者: 当关注应用的数据库数据改变时,内容提供者会发出通知,在内容提供者的uri上注册一个内容观察者,就可以收到数据改变的通知 实现步骤: 1.假如是自定义的ContentProvider,需要 ...
随机推荐
- 7.Git工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 1.工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的test文件夹就是一个工作区 ...
- Spring第一弹—-全面阐述Spring及轻重量级容器的划分
Spring是什么? Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架,它的主要目得是简化企业开发. IOC 控制反转 : 1 ...
- 微信小程序组件slider
表单组件slider:官方文档 Demo Code: var pageData = {} for (var i = 1; i < 5; i++) { (function (index) { pa ...
- td中不包含汉字的字符串不换行,包含汉字的能换行的问题原因及解决方法
今天项目中遇到一个问题,一长串的字符串如:003403FF0014E54016030CC655BC3242,但是如:中国河北省石家庄市裕华区槐安路雅清街交口 这样的就可以换行. 原因是:英文字母之间如 ...
- Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) E Underground Lab
地址:http://codeforces.com/contest/782/problem/E 题目: E. Underground Lab time limit per test 1 second m ...
- HDU - 4675 GCD of Sequence (莫比乌斯反演+组合数学)
题意:给出序列[a1..aN],整数M和k,求对1-M中的每个整数d,构建新的序列[b1...bN],使其满足: 1. \(1 \le bi \le M\) 2. \(gcd(b 1, b 2, -, ...
- Java TreeMap详细介绍和使用示例
①对TreeMap有个整体认识 TreeMap是一个有序的key-value集合,它是通过红黑树实现的. TreeMap继承于AbstractMap,所以它是一个Map,即key-value集合. T ...
- Druid学习之路 (五)Druid的数据摄取任务类型
作者:Syn良子 出处:https://www.cnblogs.com/cssdongl/p/9885534.html 转载请注明出处 Druid的数据摄取任务类型 Druid支持很多种类型的数据摄取 ...
- Web前端页面的浏览器兼容性测试心得(二)搭建原汁原味的IE8测试环境
如果你做的页面被老板或PM要求兼容IE8,你就值得同情了.IE8不支持HTML5,在2017年的前端界,开发者不涉及HTML5标准简直寸步难行.然而,有一个可怕的事实客观存在,那就是IE8是Win7系 ...
- pigeon 介绍
https://github.com/dianping/pigeon Pigeon开发指南 Pigeon是一个分布式服务通信框架(RPC),在美团点评内部广泛使用,是美团点评最基础的底层框架之一. 主 ...