信息列表中的ContentObserver、CONTENT_URI等
1. 注册ContentObserver时Sms.Inbox.CONTENT_URI应改成Sms.CONTENT_URI.
getContentResolver().registerContentObserver(Sms.Inbox.CONTENT_URI,
true, mInboxObserver);
此时Uri是Sms.Inbox.CONTENT_URI,它并没有表示一张表。我将它理解为Sms.CONTENT_URI的一个视图。
getContentResolver().registerContentObserver(Sms.CONTENT_URI,
true, mInboxObserver);
2. 在使用getContentResolver().update()方法时必须设置selection参数。
如果selection为null,表示Uri表示的所有数据都在update的范围之中。
如果Uri表示某一张表,比如Sms.CONTENT_URI表示Sms表,如果没有设定selection,那么将修改Sms表中所有数据,造成低级但严重错误。
private ContentObserver mInboxObserver = new ContentObserver(null) {
public void onChange(boolean selfChange) {
Cursor cursor = getContentResolver().query(Sms.Inbox.CONTENT_URI,
new String[]{Sms._ID, Sms.THREAD_ID, Sms.TYPE, Sms.BODY, Sms.DATE, Sms.READ},
"type = " + Sms.MESSAGE_TYPE_INBOX + " and read = 0 and thread_id = " + getOrCreateThreadId(),
null, null);
TxrjMessage msg = null;
if(cursor != null) {
if(cursor.moveToFirst()) {
msg = new TxrjMessage();
msg.setMessageId(cursor.getInt(cursor.getColumnIndex(Sms._ID)));
msg.setThreadId(cursor.getInt(cursor.getColumnIndex(Sms.THREAD_ID)));
msg.setType(cursor.getInt(cursor.getColumnIndex(Sms.TYPE)));
msg.setBody(cursor.getString(cursor.getColumnIndex(Sms.BODY)));
msg.setTime(cursor.getLong(cursor.getColumnIndex(Sms.DATE)));
mMessages.add(msg);
mHandler.sendMessage(mHandler.obtainMessage()); // 在优化过程中会改掉。
}
cursor.close();
}
if(msg != null) {
ContentValues values = new ContentValues();
values.put(Sms._ID, msg.getMessageId()); // Bug语句。
values.put(Sms.READ, 1);
getContentResolver().update(Sms.Inbox.CONTENT_URI, values, null, null); // selection为null是个bug。
}
}
};
3. 在onChange()方法中使用Handler,使程序在主线程中更新UI,
onChange()方法是否在主线程中执行,有待确定。
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mListAdapter.notifyDataSetChanged();
mListView.setSelection(mListView.getBottom());
}
};
4. 在会话列表界面中,点击某个会话打开信息列表界面之前将此会话中的未读信息改为已读。
在ConversationListActivity中点击某个item时首先执行
if(thread.getUnReadCount()>0) {
ContentValues values = new ContentValues();
values.put(Sms.READ, 1);
getContentResolver().update(Sms.Inbox.CONTENT_URI, values,
"read=0 and thread_id=" + thread.getThreadId(), null);
}
5. 将收到的未读信息在ListView中显示出来,并且修改它的read字段。
在执行getContentResolver.update()之前关闭cursor,否则:
当update()方法执行之后修改了数据,然后再从之前query返回的cursor中获得数据将出现不同步结果。
private ContentObserver mInboxObserver = new ContentObserver(null) {
public void onChange(boolean selfChange) {
Log.i("txrjsms", "receive a message.");
Cursor cursor = getContentResolver().query(Sms.CONTENT_URI,
new String[]{Sms._ID, Sms.THREAD_ID, Sms.TYPE, Sms.BODY, Sms.DATE, Sms.READ},
"type = " + Sms.MESSAGE_TYPE_INBOX + " and read = 0 and thread_id = " + mThreadId,
null, null);
TxrjMessage msg = null;
if(cursor != null) {
if (cursor.moveToFirst()) {
msg = new TxrjMessage();
msg.setMessageId(cursor.getInt(cursor.getColumnIndex(Sms._ID)));
msg.setThreadId(cursor.getInt(cursor.getColumnIndex(Sms.THREAD_ID)));
msg.setType(cursor.getInt(cursor.getColumnIndex(Sms.TYPE)));
msg.setBody(cursor.getString(cursor.getColumnIndex(Sms.BODY)));
msg.setTime(cursor.getLong(cursor.getColumnIndex(Sms.DATE)));
cursor.close();
ContentValues values = new ContentValues();
values.put(Sms.READ, 1);
getContentResolver().update(Sms.CONTENT_URI, values, "_id=" + msg.getMessageId(), null);
mMessages.add(msg);
mHandler.sendMessage(mHandler.obtainMessage());
}
}
}
};
6. 在uri中指定了具体哪条数据,因此可以将selection置为空。
private void updateMsgType(Uri uri, int type) {
ContentValues values = new ContentValues();
values.put(Sms.TYPE, type);
getContentResolver().update(uri, values, null, null);
}
信息列表中的ContentObserver、CONTENT_URI等的更多相关文章
- freecms怎样在信息列表类标签中提取info.content
原文地址:http://javaz.cn/site/javaz/site_study/info/2015/22026.html 项目地址:http://www.freeteam.cn/ 因为info. ...
- 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“项目-域名信息” http://www.mysite.com 不在以下 request 合法域名列表中
报错如图 报错文字如下: 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“项目-域名信息” http://www.mysite.net 不在以下 request 合法域名列表中 ...
- 【Azure Developer】在Azure Resource Graph Explorer中查看当前订阅下的所有资源信息列表并导出(如VM的名称,IP地址内网/公网,OS,区域等)
问题描述 通过Azure的Resource Graph Explorer(https://portal.azure.cn/#blade/HubsExtension/ArgQueryBlade),可以查 ...
- chmod a+w . 权限控制 su、sudo 修改文件所有者和文件所在组 添加用户到sudoer列表中 当前用户信息
对当前目录对所有用户开放读写权限 chmod a+r . $ sudo chmod -R a+w /usr/lib/python2.7 所有用户添加文件的写权限 [linux]su.sudo.sudo ...
- vs2015 编译时错误列表中没有错误,dll却没有生成出来
最近发现vs2015的一个问题, 编译时,错误列表中没有错误,dll却没有生成出来,vs重启也无效 解决: 多次排查发现如果一个类库设置的是framework 4.0版本,但引用了framework4 ...
- 微信小程序 不在以下合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html
微信小程序 不在以下合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html 友情提示: 大家 ...
- 从下拉菜单拖拽一个元素 出来,插入到页面中的app 列表中
1,实现功能:从下拉菜单拖拽一个元素 出来,插入到页面中的app 列表中 并实现app向后移动一个元素的位置: 2.实现思路: 01.遍历下拉菜单,添加拖拽方法,实现位置移动功能: 02.遍历app列 ...
- 在GridView列表中使用图片显示记录是否包含附件
在我的前面很多文章中,都介绍过通用附件模块的管理,本篇随笔主要介绍在一些应用模块中的列表展示中,包含附件的记录,在GridView列表界面中使用图标来快速显示是否有附件的情况. 1.通用附件模块的应用 ...
- 在滚动列表中实现视频的播放(ListView & RecyclerView)
英文原文:Implementing video playback in a scrolled list (ListView & RecyclerView) 本文将讲解如何在列表中实现视频播放. ...
随机推荐
- 如何移除EFI system partition?
莫名其妙, 在我的服务器上出现了这样一种分区, 上面写着EFI system, 删也删不掉, 因为删除分区的菜单是灰掉的. 找到了这篇文章, 成功的删掉了这个烦人的分区. 整个过程记录如下: 参考 ...
- RxJava【过滤】操作符 filter distinct throttle take skip first MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言
非科班出身, 现在才接触汇编, 惭愧呀, 好好学! 主选课本是清华大学王爽老师的<汇编语言>. 推荐 王爽老师的汇编网 汇编语言之前是机器语言. 机器语言是机器指令的集合, 机器指令是一系 ...
- 配置nginx到后端服务器负载均衡
nginx和haproxy一样也可以做前端请求分发实现负载均衡效果,比如一个tomcat服务如果并发过高会导致处理很慢,新来的请求就会排队,到一定程度时请求就可能会返回错误或者拒绝服务,所以通过负载均 ...
- 65. XPages自定义控件(三)高级搜索之三
RecordView控件的两个文件的完整代码在本文末尾给出.虽说完整,仅靠这两个文件,RecordView控件还不能正常工作,因为在这两个文件里还引用了其他自定义控件,调用了作为managed bea ...
- 数据挖掘中 决策树算法实现——Bash
数据挖掘中 决策树算法实现——Bash 博客分类: 数据挖掘 决策树 bash 非递归实现 标准信息熵 数据挖掘决策树bash非递归实现标准信息熵 一.决策树简介: 关于决策树,几乎是数据挖掘分类算法 ...
- JAVA-安装apache tomcat服务器
下载地址:http://tomcat.apache.org/ 选择需要下载的版本 下载windows service installer,找到文件双击进行安装 next i agree next ne ...
- VS2013开发asmx接口根据ID查询对象
代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syst ...
- 一个十年IT从业者的职场感言:为什么不要自称是“程序员”
转载:https://blog.csdn.net/S_king_/article/details/78529089 如果我可以给每个工程教育增加一门课,它不会涉及编译器.门电路或是时间复杂度,而是一门 ...
- C#.NET常见问题(FAQ)-如何设置控件水平对齐,垂直对齐
如果要设置一些控件垂直对齐,点击这个按钮 如果要设置水平对齐,则点击这个按钮,选中控件之后点击左对齐(多个按钮都试下吧,总归能对齐到你要的效果的) 更多教学视频和资料下载,欢迎关注以下信息: ...