Android Mms專題——草稿管理

本文轉自http://blog.csdn.net/hitlion2008/article/category/945580,感謝作者文章對於我的指導,作者這個系列的文章對做Mms開發有極大的幫助,希望也能給更多的人啓發



當編輯完一條信息後,如果在沒有發送的情況下退出編輯頁面,那麼信息會自動保存爲草稿。也就是在ComposeMessageActivityonStop()時,如果還沒有發送,那麼就會調用WorkingMessage.saveDraft()來把信息保存爲草稿。期間也會檢查一些條件,比如消息是否已被標識爲放棄,或是是否爲空(isWorthSaving),如果一切正常會saveDraft()並會用Toast來告知信息已保存爲草稿。

草稿的保存也是針對不同的信息而不同,短信和彩信的流程有所不同。

保存短信爲草稿

WorkingMessage會先取出短信內容,然後開啓一個新的線程去做接下來的事,WorkingMessage.saveDraft()也會就此返回。在線程中,會先確保ThreadId的正確,如果沒有正確的ThreadId,就不會保存。接着把信寫進數據庫,把Type標識爲Draft。最後會刪除這個Thread所擁有的彩信草稿,因爲一個Thread中只能有一個草稿,所以如果有了新的短信草稿那麼就要刪除舊的彩信草稿,同理,後面保存彩信草稿的時候也會刪除短信草稿的。

保存彩信爲草稿

與保存短信類似,ComposeMessageActivityonStop時調用WorkingMessage.saveDraft()WorkingMessage.saveDraft()先會刷新收信人信息,然後會創建一個彩信的數據結構SendReq,然後啓動線程做其他的事,saveDraft()也就此返回。在線程中,先是保證是一個合法的Thread,也就是threadid要正確。同時也要把這個Thread標誌爲有草稿,這個是由一個DraftCache在管理,它是一個HashMap,來標識哪些Thread含有Draft。如果這個Thread以前沒有附件,那麼就爲它創建附件,也就是把SendReq寫入數據庫;相反,如果已有了附件,那麼就更新數據庫,把SendReqSlideshow,日期更新成爲當前信息的內容。最後刪除掉已有短信草稿。

這裏要注意的對於彩信的操作都由Frameworks中的com.google.android.mms.*包裏面提供的類和工具來完成的,它裏面會提供Android所支持的彩信的數據結構SendReq,把數據(TextMediasFiles)放入SendReq的方法PduPartPduBody,把SendReq寫入數據庫和從數據中讀取SendReq—通過PduPersister。客戶端的應用程序,只是創建SendReq,用提供的方法把數據寫入SendReq中,用PduPersister來寫入數據庫和從數據庫中提取,最後用HTTP協議把SendReq發送出去。

同時還有一個專門的類DraftCache用來管理哪些Thread含有草稿,它的內部是一個HashMap,可以標識哪些Therad含有草稿。所以,在對草稿操作的地方都會用到DraftCache,如果一個Thread含有草稿,就需要把它的ThreadId標識爲有草稿;如果一個Thread的信息已發送出去,就要把它標識爲不含有草稿。

傳統的以文件夾方式管理信息都會有一個專門用於存放草稿的文件夾叫草稿箱。每次編輯信息,無論是發給哪個人,都可以放入這草稿箱。但是這裏也可以發現,與傳統的以文件夾方式不同,Android中的Mms的草稿是每個Thread一個,而且只有一個,換句話說,不可能存儲太多的草稿。因爲Android中的Mms是以對話Thread方式來管理信息的,而一個Thread,一次對話,只應該有一個沒“說完”的話,所以這種設計也是合常理的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章