1. 程式人生 > >高通android 7.0簡訊草稿儲存流程

高通android 7.0簡訊草稿儲存流程

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