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. Cassandra数据模型

    Ⅰ.数据模型 1.1 Column 一组包含Name/Value Pair的数据叫Row,其中每一组Name/Value Pair叫Column Column是Cassandra最基本的数据结构,它是 ...

  2. 是否能设计一种DNN的特定网络结构来改善DNN,使得其学习起来更加高效

    小结: 1. 是否能设计一种DNN的特定网络结构来改善DNN,使得其学习起来更加高效 https://mp.weixin.qq.com/s/lF_WLAn6JyQqf10076hsjA Deep &a ...

  3. 使用npm 下载 cnpm

    在vue终端使用npm 1. 下载安装node.js 在node.js中有集成npm 2. 可以在终端中使用 node -v / npm -v 来查看安装的node/npm 的版本号 使用npm 安装 ...

  4. [ipsec][crypto] 在IPSec ESP使用AES-GCM加密时的IV

    IV IV是指初始化向量. 在我们当前讨论的场景中: 在IPSec ESP使用AES-GCM加密 IV有两个含义: 1. ESP报文封装时的IV,RFC中称为 AES-GCM IV +-+-+-+-+ ...

  5. 关于Android布局优化的代码使用

    1.  include标签: include标签的作用是在一个布局文件中导入另一个布局文件.在开发中经常会有多个页面同时拥有一部分相同的布局,这个时候如果每个布局都把那个部分的代码写一遍就会使得代码重 ...

  6. numpy(四)

    逻辑符 : ==  !=  <  > <=  >= x=np.array([1,3,5]) x<3 array([True,False,,False]) (2*x) == ...

  7. [转]GO 开发rest api 接口

    注明出处:https://blog.csdn.net/haowenqi008/article/details/79150705 最近在研究Go,打算基于Go做点Web API,于是经过初步调研,打算用 ...

  8. linux alias 命令 查看系统设置的命令别名

    alias命令用于查看或设置命令别名,但仅作用于该次登陆的会话,若要永久使用别名,可在 ~/.bashrc 中设定别名 [root@MongoDB ~]# alias // 查看别名 [root@Mo ...

  9. 关于autofac的一些具体的用法

    简介:Autofac是一个.net下非常优秀,性能非常好的IOC容器(.net下效率最高的容器) 1.nuget 引用 2.创建两个类库项目,IService (用于编写接口),ServiceImpl ...

  10. 干了这杯Java之HashMap

    类: public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneab ...