高通android 7.0短信会话界面加载流程

原创 2017年09月13日 15:20:07
在短信会话列表界面,点击其中一条记录,会进入相对应的短信会话详情界面。
短信加载内容分为草稿和历史聊天记录。UI分面分为新建短信和打开已经保存在数据库的历史短信会话。

新建短信在前面我们已经分析了。现在我们来分析打开已经保存在数据库的历史短信会话的流程。并且分析短信加载草稿和历史聊天记录的流程。

ConversationList.java

public void openThread(long threadId) {//打开threadId对应的会话
        startActivity(ComposeMessageActivity.createIntent(this, threadId));
    }

其中有很多是跟新建短信一样的,我们着重分析不一样和前面没有分析过的代码流程。

onCreate
initialize
initActivityState
long threadId = intent.getLongExtra(THREAD_ID, 0);
        if (threadId > 0) {
            if (LogTag.VERBOSE) log("get mConversation by threadId " + threadId);
            mConversation = Conversation.get(this, threadId, false);
        }
Conversation 可以说是一个会话的上下文,WorkingMessage表示正在编辑的相关内容,而Conversation对应thread表的内容
get会去缓存查找,我们第一次进入是null,所以需要新建
private Conversation(Context context, long threadId, boolean allowQuery) {//此时allowQuery传递进来的是false
        if (DEBUG) {
            Log.v(TAG, "Conversation constructor threadId: " + threadId);
        }
        mContext = context;
        if (!loadFromThreadId(threadId, allowQuery)) {
            mRecipients = new ContactList();
            mThreadId = 0;
        }
    }
loadFromThreadId(threadId, allowQuery)
Cursor c = mContext.getContentResolver().query(sAllThreadsUri, ALL_THREADS_PROJECTION,
                "_id=" + Long.toString(threadId), null, null);根据threadId查找thread表
fillFromCursor(mContext, this, c, allowQuery);根据查询到的内容填充Conversation
这部分读者自己查看,就是查询到的内容填充Conversation的变量
ContactList recipients = ContactList.getByIds(recipientIds, allowQuery); 
recipientIds这个是收件人id,查询具体的联系人详情,这个后面说

else {
            hideRecipientEditor();
        }//不需要收件人编辑框,隐藏之。

drawBottomPanel();//需要绘制文字编辑框相关的区域


接下来是onStart的查询历史记录内容和加载草稿
loadMessagesAndDraft(2);
loadMessageContent();加载短信内容
startMsgListQuery();
startMsgListQuery(MESSAGE_LIST_QUERY_TOKEN);
mBackgroundQueryHandler.startQuery(
                    token,
                    threadId /* cookie */,
                    conversationUri,
                    PROJECTION,
                    null, null, null);
具体到数据库,会查询thread_Id为threadId的文字短信和彩信返回。
查询结束后,会回调BackgroundQueryHandler的onQueryComplete
mMsgListAdapter.changeCursor(cursor);改变list的内容

接下来还会加载草稿
loadDraft()
mWorkingMessage = WorkingMessage.loadDraft(this, mConversation,
                new Runnable() {
                    @Override
                    public void run() {
                        updateMmsSizeIndicator();
                        // It decides whether or not to display the subject editText view,
                        // according to the situation whether there's subject
                        // or the editText view is visible before leaving it.
                        drawTopPanel(isSubjectEditorVisible());
                        drawBottomPanel();
                        updateSendButtonState();
                    }
                });
WorkingMessage.java
loadDraft
final WorkingMessage msg = createEmpty(activity);
        if (conv.getThreadId() <= 0) {//threadId为空,直接执行回调,刷新UI
            if (onDraftLoaded != null) {
                onDraftLoaded.run();
            }
            return msg;
        }

new AsyncTask<Void, Void, Pair<String, String>>() {开启后台线程查询草稿

protected Pair<String, String> doInBackground(Void... none) {
                // Look for an SMS draft first.
                String draftText = msg.readDraftSmsMessage(conv);//查询文本短信的草稿
                String subject = null;

                if (TextUtils.isEmpty(draftText)) {
                    // No SMS draft so look for an MMS draft.
                    StringBuilder sb = new StringBuilder();
                    Uri uri = readDraftMmsMessage(msg.mActivity, conv, sb);//如果没有文本短信草稿,则查询彩信草稿
                    if (uri != null) {
                        if (msg.loadFromUri(uri)) {//如果pdu表有记录,则继续加载part表中彩信内容
                            // If there was an MMS message, readDraftMmsMessage
                            // will put the subject in our supplied StringBuilder.
                            subject = sb.toString();
                        }
                    }
                }
                Pair<String, String> result = new Pair<String, String>(draftText, subject);
                return result;
            }


readDraftSmsMessage
Cursor c = SqliteWrapper.query(mActivity, mContentResolver,
                        thread_uri, SMS_BODY_PROJECTION, SMS_DRAFT_WHERE, null, null);
查询类型为draft的thread_id为threadId的sms表的记录,此时只需要Sms.BODY这个字段的内容
如果查询到了有文本草稿,则asyncDeleteDraftSmsMessage(conv);删除掉文本草稿,因为已经加载成功了,而且草稿有可能继续编辑,所以原来的那个已经无用了。

readDraftMmsMessage
cursor = SqliteWrapper.query(context, cr,
                Mms.Draft.CONTENT_URI, MMS_DRAFT_PROJECTION,
                selection, null, null);
这个只是查找了pdu表的,如果有彩信草稿,我们还需要加载part表,将彩信内容加载出来。

loadFromUri
mSlideshow = SlideshowModel.createFromMessageUri(mActivity, uri);我们之前说过,彩信内容就是存放在SlideshowModel中的。

这样加载完内容后就回调刷新UI。

相关文章推荐

Android 接收和发送短信

1.android发送短信                 android API 中提供了smsManager类处理短信。其中的sendTextMessage(num, null, conte...

Android6.0的SMS(短信)源码分析--短信接收

1     SMS接收流程 Android6.0中对短信的处理比起老版本还是变化有点大的。在分析源代码之前,我们可以先猜测一下Android中接收短信的大致流程。首先根据之前分析phone应用的经验...

Android调用系统打电话和发短信功能

一、打电话      1、添加打电话的权限在manifast文件中。            Android:name="android.permission.CALL_PHONE"/> ...

高通android 7.0新建短信流程

在短信列表,点击新建短信按钮,进入新建短信流程。 ConversationList.java public void createNewMessage() {         startA...

这个年纪:齐一

这是一首歌,先献上歌词: 当我发现我已到了该成家的年纪 但我的女人呢 但我的女人呢 当我习惯把实话都变成了童话 那我的单纯呢 那我的单纯呢 这个年纪我已不再将就 有些事情无法强求 该来...

Android 7.0Settings加载主界面流程

新人一枚,没有整机环境,有什么写的不对欢迎批评指正,万分感谢! Settings主界面加载时序图(这里很多判断逻辑我省略掉了。更多的是想把加载主界面流程跑通。) 这张流程图将主fragm...
  • A771642
  • A771642
  • 2017年04月20日 18:15
  • 2069

Android 7.0 插卡后APN信息的加载流程、UI界面编辑APN的流程及Android中APN配置相关的漏洞

本篇博客主要分析了APN相关的常用流程,以及实际存在的APN相关的漏洞。

Linux加载DTS设备节点的流程(高通一)

ARM : 一. 启动条件 通常从系统上电执行的boot loader的代码, 而要从boot loader跳转到linux kernel的第一条指令处执行需要一些特定的条件。 ...

(最新内核3.4)Linux 设备树加载I2C client adapter 的流程(内核3.4 高通)

(最新内核3.4)Linux 设备树加载I2C client adapter 的流程(内核3.4 高通)

Android7.0 Activity的绘制加载流程

涉及类: frameworks\base\core\java\android\app\Activity.java frameworks\base\core\java\com\android\int...
  • abm1993
  • abm1993
  • 2017年03月08日 15:13
  • 387
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高通android 7.0短信会话界面加载流程
举报原因:
原因补充:

(最多只允许输入30个字)