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. VSCode打开多个项目文件夹的解决方法

    最近从sublime转vscode,自然而然就会把sublime的一些习惯带过来,其中有一点让人头疼的是: 当把一个文件夹拖进vscode里面的时候,会把原来的文件夹覆盖掉,这就意味着不能同时在vsc ...

  2. poj2362

    #include<iostream> using namespace std; ]; int total; int rec; int n; ]; int flag; int flag1; ...

  3. 第一编,漫漫长征路,第一天学习python

    安装之后,出现 api-ms-win-crt-runtimel1-1-0.dll缺失   还在解决中 重装系统后,安装成功 python的种类: javapython cpython pypy

  4. docker镜像导入导出

    1.使用 save命令将 镜像保存为文件docker save -o  自定义文件名.tar  已存在的镜像名 2.使用load命令将镜像文件保存到本地仓库docker load -i 自定义文件名. ...

  5. .Net Core知识点

    1:const,readonly,和get访问器,三者都可在自己的生命域里赋值,但是编译器也是可以在构造函数里进行初始化赋值的 2:Debugger.IsAttached 属性 http://msdn ...

  6. 意外的php之学习笔记

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gc_gongchao/article/details/37312039     什么是php? ph ...

  7. oracle 表空间,用户的创建及授权,表空间基本操作

    参考地址:https://www.cnblogs.com/zhaideyou/articles/5845271.html Oracle安装完后,其中有一个缺省的数据库,除了这个缺省的数据库外,我们还可 ...

  8. 使用LVM进行分区扩展的记录

    场景:在磁盘分区空间不够的情况下,要扩展分区空间 因为使用的是虚拟机,所以可以对原有的硬盘上进行扩展,而不需要新增一个硬盘 1.扩展磁盘并使用fdisk工具进行分区 虚拟机关机后对磁盘进行扩展,扩展到 ...

  9. MVC5+EF6 完整教程17--升级到EFCore2.0(转)

    MVC5+EF6 完整教程17--升级到EFCore2.0 2017年08月22日 14:48:12 linux12a 阅读数:2814   EF Core 2.0上周已经发布了,我们也升级到core ...

  10. php----------linux下安装php的swoole扩展

    1.首先你已经安装好了php环境,这里就不介绍php环境的安装了.如果你是编译安装记得将php加入环境变量,以便于方便查看扩展是否安装成功. 2.我安装的php环境缺少了要给东西,详细看下图 如果你没 ...