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之短信会话列表加载流程一的更多相关文章

  1. Android 向系统发送一条短信

    s //向系统写一条短信 ContentValues contentValues = new ContentValues(); contentValues.put("body",& ...

  2. Android 短信模块分析(四) MMS之短信的发送与接收

     MMS之短信的发送与接收分析: 一.信息发送: com.android.mms.data.WorkingMessage.java 类 send()函数: public void send() { . ...

  3. Android 解决双卡双待手机解析短信异常

    开发中,难免会遇到各种各样的适配问题,尤其是经过深度修改定制过的系统,有的无论是软硬件上都有很大的区别,这里不得不提到一种奇葩的机型,没错,那就是双卡双待的手机(比如XT800, A60, S8600 ...

  4. Android手机上监听短信的两种方式

    Android手机上监听短信有两种方式: 1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. AndroidManifest.xml: ...

  5. 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...

  6. Android安卓电话拦截及短信过滤

    package com.focus.manager; import java.lang.reflect.Method; import Android .app.Activity; import And ...

  7. [转]Android 超高仿微信图片选择器 图片该这么加载

    快速加载本地图片缩略图的方法: 原文地址:Android 超高仿微信图片选择器 图片该这么加载 其示例代码下载: 仿微信图片选择器 ImageLoader

  8. Android在layout xml中使用ViewStub完成动态加载

    Android在layout xml中使用ViewStub完成动态加载 一.Layout XML文件常见的两种模块加载方式 1.静态加载:被加载的模块和其它模块加载的时间一样. <include ...

  9. Android在layout xml中使用include完成静态加载

    Android在layout xml中使用include完成静态加载 include静态加载:不仅可以加载布局,还可以加载控件(控件标签名要在最外层)include标签中有个layout属性就是专门用 ...

随机推荐

  1. 基础作业 本周没上课,但是请大家不要忘记学习。 本周请大家完成上周挑战作业的第一部分:给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。 例如:[1, -2, 3, 10, -4, 7, 2, -5]的最大子数组为[3, 10, -4, 7, 2] 输入: 请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。 输出 在不删除原有文件内容

    1丶 实验代码 #include<stdio.h> int main(void) { int tt,nn,i,j,c[11][11]; int flag=1; scanf("%d ...

  2. 刀客139qq算命

    https://www.zhouyi.cc/bazi/sm/BaZi.php 好的算命网站 根据辛亥时看出来的午亥暗合没那么简单他不克你她太弱了婚姻不顺,是因为夫妻宫是财坏印是要比劫克财克财很重要 出 ...

  3. Delphi 2010 新增功能之: IOUtils 单元(6): TPath(结构体) 的方法与属性

    以后路径相关的处理, 用 IOUtils.TPath 就很方便了. //较常用的方法: TPath.GetTempPath;                  {获取临时文件夹路径} TPath.Ge ...

  4. 在Vuex更新,组件内的视图更新问题

    由于js的限制,vue无法进行监听数组; 当你利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue 当你修改数组的长度时,例如: vm.items.len ...

  5. 监听器 Listener

    监听器:监听某个对象状态的变化 被监听的对象:request.session.servletContext 监听对象的创建和销毁/对象属性的变化 ServletContext HttpSession ...

  6. python celery多worker、多队列、定时任务

    python celery多worker.多队列.定时任务  

  7. MessengerJS

    跨文档通信解决方案 Since modern browsers have native cross-document communication method(the PostMeessage API ...

  8. 23.C# 语言的改进

    1.对象初始化器 class Curry { public string MainIngredient{get;set;} public string Style { get; set; } publ ...

  9. 控制反转IOC

    IOC-Inversion of Control 控制反转,这是spring的核心.对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系. 1:控制反转不是一种技术,而是 ...

  10. Elasticsearch.安装(单节点)

    Elasticsearch.安装(单节点) 环境Linux 7.x jdk 1.8 elasticsearch 5.x 环境目录结构(根目录多了两个文件夹): /resources    /** 存放 ...