Android系统应用Mms之短信会话列表加载流程一
1. ConversationList短息会话列表界面
1. 开始进行加载
ConversationList:
protected void onStart(){
...
// 进行异步查询
startAsyncQuery();
} private void startAsyncQuery() {
...
// 加载消息
mLoaderFragment.reLoadMessage(THREAD_LIST_QUERY_TOKEN, // token: 1701
Conversation.sAllThreadsUri,// 查询的Uri: content://mms-sms/conversations&simple=true
Conversation.ALL_THREADS_PROJECTION,// 查询的字段
null, null,
Conversations.DEFAULT_SORT_ORDER);
...
} 2. 进入到MessageLoaderFragment, 进行加载
MessageLoaderFragment:
public void reLoadMessage(int loadId, Uri uri, String[] projection,
String selection, String[] selectionArgs, String orderBy) {
...
// 进行异步加载
getLoaderManager().restartLoader(loadId, null, mMessageLoaderListener);
} 3. 进入到MmsSmsProvider中执行查询流程
MmsSmsProvider:
public Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
...
switch(URI_MATCHER.match(uri)) {
...
case URI_CONVERSATIONS:
String simple = uri.getQueryParameter("simple");
if ((simple != null) && simple.equals("true")) {
String threadType = uri.getQueryParameter("thread_type"); // 获取会话类型
if (!TextUtils.isEmpty(threadType)) {
selection = concatSelections(selection, Threads.TYPE + "=" + threadType);
}
// 获取简单会话
cursor = getSimpleConversations(projection, selection, selectionArgs, sortOrder);
} else {
cursor = getConversations(projection, selection, sortOrder);
}
break;
...
}
...
return cursor;
} private Cursor getSimpleConversations(String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 到此处已完成会话的查询, 接下来看数据的填充
return mOpenHelper.getReadableDatabase().query(TABLE_THREADS, // threads数据库
projection, selection,
selectionArgs, null, null,
" date DESC");
} 4. 数据加载完成后回调到MessageLoaderFragment$LoaderManager.LoaderCallbacks<Cursor>中
MessageLoaderFragment$LoaderManager.LoaderCallbacks<Cursor>:
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
...
// 数据加载完成回调到ConversationList中
mListener.onMessageLoaded(data, loader);
} 5. 数据回调到ConversationList$MessageLoaderFragmentListener中
ConversationList$MessageLoaderFragmentListener:
public void onMessageLoaded(Cursor cursor, Loader<Cursor> loader) {
// 更新UI
mListAdapter.changeCursor(cursor);
...
} 短信会话列表加载涉及到的数据库:
MmsSmsDatabaseHelper:
数据库名: MmsSmsProvider:
static final String TABLE_THREADS = "threads"
数据库的创建:
private void createCommonTables(SQLiteDatabase db) {
...
db.execSQL("CREATE TABLE threads (" +
Threads._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +// id
Threads.DATE + " INTEGER DEFAULT 0," + // 时间
Threads.MESSAGE_COUNT + " INTEGER DEFAULT 0," + // 消息数量
Threads.RECIPIENT_IDS + " TEXT," + // 接受者ID
Threads.SNIPPET + " TEXT," + // 片段
Threads.SNIPPET_CHARSET + " INTEGER DEFAULT 0," + // 片段编码
Threads.READ + " INTEGER DEFAULT 1," + // 是否已读
Threads.TYPE + " INTEGER DEFAULT 0," + // 类型
Threads.ERROR + " INTEGER DEFAULT 0," + // 是否有错
Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0," + // 是否有附件
Threads.RECIPIENT_ADDRESSES + " TEXT, " + // 接受者地址
Threads.RECIPIENT_NAMES + " TEXT ); "); // 接受者姓名
}
Android系统应用Mms之短信会话列表加载流程一的更多相关文章
- Android 向系统发送一条短信
s //向系统写一条短信 ContentValues contentValues = new ContentValues(); contentValues.put("body",& ...
- Android 短信模块分析(四) MMS之短信的发送与接收
MMS之短信的发送与接收分析: 一.信息发送: com.android.mms.data.WorkingMessage.java 类 send()函数: public void send() { . ...
- Android 解决双卡双待手机解析短信异常
开发中,难免会遇到各种各样的适配问题,尤其是经过深度修改定制过的系统,有的无论是软硬件上都有很大的区别,这里不得不提到一种奇葩的机型,没错,那就是双卡双待的手机(比如XT800, A60, S8600 ...
- Android手机上监听短信的两种方式
Android手机上监听短信有两种方式: 1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. AndroidManifest.xml: ...
- 利用Android Lost通过互联网或短信远程控制安卓设备
利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...
- Android安卓电话拦截及短信过滤
package com.focus.manager; import java.lang.reflect.Method; import Android .app.Activity; import And ...
- [转]Android 超高仿微信图片选择器 图片该这么加载
快速加载本地图片缩略图的方法: 原文地址:Android 超高仿微信图片选择器 图片该这么加载 其示例代码下载: 仿微信图片选择器 ImageLoader
- Android在layout xml中使用ViewStub完成动态加载
Android在layout xml中使用ViewStub完成动态加载 一.Layout XML文件常见的两种模块加载方式 1.静态加载:被加载的模块和其它模块加载的时间一样. <include ...
- Android在layout xml中使用include完成静态加载
Android在layout xml中使用include完成静态加载 include静态加载:不仅可以加载布局,还可以加载控件(控件标签名要在最外层)include标签中有个layout属性就是专门用 ...
随机推荐
- MySQL执行计划复习
MySQL执行计划分析 Ⅰ.认识执行计划的每个字段 (root@localhost) [(none)]> desc select 1; +----+-------------+-------+- ...
- [Day17]常用API(System、Math、Arrays、BigInteger、BigDecimal)
1.基本类型包装类 1.1 8种基本类型对应的包装类 字节型 byte Byte 短整型 short Short 整型 int Integer 长整型 long Long 字符型 char Chara ...
- ARE 212 - Problem Set 5
ARE 212 - Problem Set 5Due May 1stPart I: Theory (Optional)1. Show that the parameter estimates for ...
- Linux_磁盘分布_以及分区
运用 Xshell 工具链接到你的服务器 1. Fdisk -l 这是查看磁盘挂载列表情况 2. Fdisk /dev/vdc 这是分区这个磁盘 m 是查看信息 ...
- LeetCode 606 Construct String from Binary Tree 解题报告
题目要求 You need to construct a string consists of parenthesis and integers from a binary tree with the ...
- IntelliJ IDEA 指定Java编译版本
在IntelliJ IDEA 15中使用Maven时,IDEA将默认的编译版本.源码版本设置为jdk5.编译项目的时候出现警告:”Warning:Java: 源值1.5已过时, 将在未来所有发行版中删 ...
- 用node在本机搭建一个极其简单的服务器
首先安装node, 建一个文件夹server, 在里面创建一个server.js,内容如下: var http = require("http"); http.createServ ...
- JS生成当前月份包括最近12个月内的月份
var last_year_month = function() { var result = []; for(var i = 0; i < 12; i++) { var d = new Dat ...
- MySQL InnoDB Online DDL学习
MySQL Online DDL这个新特性是在MySQL5.6.7开始支持的,更早期版本的MySQL进行DDL对于DBA来说是非常痛苦的.现在主流版本都集中在5.6与5.7,为了更好的理解Online ...
- 19.C# 泛型
1.泛型的概念 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用. 2. .net提供的泛型 2.1可空 ...