高通android 7.0簡訊草稿儲存流程
阿新 • • 發佈:2019-02-16
簡訊應用,當輸入聯絡人並且簡訊內容不為空,在沒有傳送的情況下退出簡訊介面,則會進行簡訊草稿儲存,以便下次重新進入會話介面可以重新載入,進行重新編輯或者傳送。
我們現在就來分析其流程:
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。
所以簡訊儲存草稿的流程還是很簡單的。
當點選退出會話介面,就會觸發 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);
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);
所以簡訊儲存草稿的流程還是很簡單的。