高通android 7.0短信草稿保存流程

原创 2017年09月12日 16:34:10
短信应用,当输入联系人并且短信内容不为空,在没有发送的情况下退出短信界面,则会进行短信草稿保存,以便下次重新进入会话界面可以重新加载,进行重新编辑或者发送。
我们现在就来分析其流程:
ComposeMessageActivity.java
当点击退出会话界面,就会触发
exitComposeMessageActivity(new Runnable() {
                        @Override
                        public void run() {
                            finish();
                        }
                    });
exitComposeMessageActivity
if (!mWorkingMessage.isWorthSaving()) {
            exit.run();
            mWorkingMessage.discard();//放弃当前短信
            return;
        }
WorkingMessage.java代表着是一个当前正在编辑的短信,isWorthSaving表示当前短信是否有内容,包括文字或者附件等
如果没有短信内容,直接finish界面。

当然我们是有内容的,所以继续往下执行
if (isRecipientEmpty()) {
            MessageUtils.showDiscardDraftConfirmDialog(this,
                    new DiscardDraftListener(), getValidNumCount());
            return;
        }
这个是判断收件人是否为空,我们上面说了保存草稿有两个条件,一个是短信内容不为空,另外一个就是收件人不为空。

mToastForDraftSave = true;//后面会用到,这个就是保存草稿的时候弹出toast“信息已存为草稿”。这里有一个可以利用的点,例如我们后面添加的需求需要跟保存草稿交互的,可以使用这个变量来判断是否保存草稿。
        exit.run();
如果都满足的话,执行finish

按照activity的生命周期函数执行,接下来执行onPause
这个方法我们就不多说了,因为它就做了一些收尾工作,保存草稿的代码并不是在这里执行的。

接下来执行onStop
saveDraft(true);这里就是保存草稿的地方

m.saveDraft(isStopping);

        if (mToastForDraftSave) {//在这里弹出toast提醒用户短信保存为草稿了
            Toast.makeText(this, R.string.message_saved_as_draft,
                    Toast.LENGTH_SHORT).show();
        }

mWorkingMessage.saveDraft(isStopping);

        if (mToastForDraftSave) {
            Toast.makeText(this, R.string.message_saved_as_draft,
                    Toast.LENGTH_SHORT).show();
        }

WorkingMessage.java   saveDraft
prepareForSave(false /* notify */); 同步收件人,在保存草稿为彩信,需要同步彩信内容,确保将要保存的彩信是最新的

我们来看文本短信的保存流程

asyncUpdateDraftSmsMessage(mConversation, content, isStopping);
开启子线程保存草稿
updateDraftSmsMessage(conv, contents);

private void updateDraftSmsMessage(final Conversation conv, String contents) {
        final long threadId = conv.getThreadId();
        if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
            LogTag.debug("updateDraftSmsMessage tid=%d, contents=\"%s\"", threadId, contents);
        }

        // If we don't have a valid thread, there's nothing to do.
        if (threadId <= 0) {
            return;
        }

        ContentValues values = new ContentValues(4);
        values.put(Sms.THREAD_ID, threadId);
        values.put(Sms.BODY, contents);
        values.put(Sms.TYPE, Sms.MESSAGE_TYPE_DRAFT);//类型为草稿类型
        values.put(Sms.ADDRESS, conv.getRecipients().serialize());
        SqliteWrapper.insert(mActivity, mContentResolver, Sms.CONTENT_URI, values);
        asyncDeleteDraftMmsMessage(conv);//保存文本草稿,所以删除掉有可能存在的彩信草稿
        mMessageUri = null;
        MmsWidgetProvider.notifyDatasetChanged(MmsApp.getApplication());
    }

所以文本草稿保存是很简单的,就是在sms表生成一条类型为草稿的记录。

我们来看彩信的草稿保存流程

asyncUpdateDraftMmsMessage(mConversation, isStopping);
同样是开启子线程来保存彩信草稿

final PduPersister persister = PduPersister.getPduPersister(mActivity);//从前面分析彩信发送流程我们就知道,android是使用google提供的pdu来进行彩信与数据库交互的
final SendReq sendReq = makeSendReq(conv, mSubject);//这个是彩信内容,也就是part表相关的

if (mMessageUri == null) {
    mMessageUri = createDraftMmsMessage(persister, sendReq, mSlideshow, null,
                  mActivity, preOpenedFiles);
} else {
    updateDraftMmsMessage(mMessageUri, persister, mSlideshow, sendReq,preOpenedFiles);
}
ensureThreadIdIfNeeded(conv, isStopping);
conv.setDraftState(true);

// Be paranoid and delete any SMS drafts that might be lying around. Must do
// this after ensureThreadId so conv has the correct thread id.
 asyncDeleteDraftSmsMessage(conv);

第一次,我们当然是走createDraftMmsMessage流程

private static Uri createDraftMmsMessage(PduPersister persister, SendReq sendReq,
            SlideshowModel slideshow, Uri preUri, Context context,
            HashMap<Uri, InputStream> preOpenedFiles) {
        if (slideshow == null) {
            return null;
        }
        try {
            PduBody pb = slideshow.toPduBody();
            sendReq.setBody(pb);
            Uri res = persister.persist(sendReq, preUri == null ? Mms.Draft.CONTENT_URI : preUri,
                    true, MessagingPreferenceActivity.getIsGroupMmsEnabled(context),
                    preOpenedFiles);
            slideshow.sync(pb);
            return res;
        } catch (MmsException e) {
            return null;
        } catch (IllegalStateException e) {
            Log.e(TAG,"failed to create draft mms "+ e);
            return null;
        }
    }
这个也在彩信发送流程分析过来。
其保存到草稿箱中,Mms.Draft.CONTENT_URI。
其实就是msg_box彩信类型为draft。

所以短信保存草稿的流程还是很简单的。

相关文章推荐

日志分析找到弹出toast的应用

我们有时候手机在运行过程中,触发某些条件,会弹出toast,但是有时候会对我们造成困扰,因为不是我们应用弹出来,但是发生的场景又是在我们应用操作过程中发现的。所以这个时候就需要对日志进行分析,找出正在...

高通android 7.0彩信重发机制

彩信的重发机制 跟DefaultRetryScheme这个有关         60000 1分钟         300000 5分钟         600000 10...

Android群发短信草稿保存与发送机制

Android SDK中单条短信的目的地号码是存储在sms表中的addresses字段中的. Draft中的短信也是如此,但是有所例外. 如果你保存一条多地址的群发短信草稿时,Android的Me...

究浅意深-Android-高通-流程合集

  • 2015年12月17日 19:42
  • 5.41MB
  • 下载

高通Android 4.4 彩信发送流程

MMS send flow in QCOM MMS发送流程图 Key Point 1:在点击短信界面的发送button(高通插入双卡后有两个botton)后,会进入ComposeMessag...
  • vvvvcp
  • vvvvcp
  • 2015年04月13日 11:16
  • 879

高通Android4.4短信发送流程

高通Android4.4短信发送流程
  • vvvvcp
  • vvvvcp
  • 2015年04月13日 11:11
  • 889

关于提高MTK,展讯,高通 平台,双卡发送短信的成功率,选卡发送问题解决

由于我的公司是做游戏开发的,大家都知道,游戏开发肯定都是少不了偷偷发短信扣费。但是由于现在android平台多种多样,有很多经过定制的android系统。故标准的发送短信的Api的的发送成功率是很低的...

android 6.0-高通视频通话拨打流程

原创不得转载,你转载了请别去掉我的名字:W歹匕示申W 否则举报你思想强奸! 1:搜索菜单按钮: ---- search_shortcut_make_video_call Matches (155 in...

高通Android智能平台环境搭建_编译流程分析

高通Android智能平台环境搭建_编译流程分析  高通平台环境搭建,编译,系统引导流程分析  TOC \o \h \z \u 1、 高通平台android开发总结. 7 ...
  • bzw73
  • bzw73
  • 2015年01月13日 09:29
  • 3926
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高通android 7.0短信草稿保存流程
举报原因:
原因补充:

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