Android Mms之:草稿管理的应用

当编辑完一条信息后,如果在没有发送的情况下退出编辑页面,那么信息会自动保存为草稿。也就是在ComposeMessageActivity的onStop()时,如果还没有发送,那么就会调用WorkingMessage.saveDraft()来把信息保存为草稿。期间也会检查一些条件,比如消息是否已被标识为放弃,或是是否为空(isWorthSaving),如果一切正常会saveDraft()并会用Toast来告知信息已保存为草稿。
草稿的保存也是针对不同的信息而不同,短信和彩信的流程有所不同。
保存短信为草稿
WorkingMessage会先取出短信内容,然后开启一个新的线程去做接下来的事,WorkingMessage.saveDraft()也会就此返回。在线程中,会先确保ThreadId的正确,如果没有正确的ThreadId,就不会保存。接着把信写进数据库,把Type标识为Draft。最后会删除这个Thread所拥有的彩信草稿,因为一个Thread中只能有一个草稿,所以如果有了新的短信草稿那么就要删除旧的彩信草稿,同理,后面保存彩信草稿的时候也会删除短信草稿的。
保存彩信为草稿
与保存短信类似,ComposeMessageActivity在onStop时调用WorkingMessage.saveDraft();WorkingMessage.saveDraft()先会刷新收信人信息,然后会创建一个彩信的数据结构SendReq,然后启动线程做其他的事,saveDraft()也就此返回。在线程中,先是保证是一个合法的Thread,也就是threadid要正确。同时也要把这个Thread标志为有草稿,这个是由一个DraftCache在管理,它是一个HashMap,来标识哪些Thread含有Draft。如果这个Thread以前没有附件,那么就为它创建附件,也就是把SendReq写入数据库;相反,如果已有了附件,那么就更新数据库,把SendReq和Slideshow,日期更新成为当前信息的内容。最后删除掉已有短信草稿。

这里要注意的对于彩信的操作都由Frameworks中的com.google.android.mms.*包里面提供的类和工具来完成的,它里面会提供Android所支持的彩信的数据结构SendReq,把数据(Text,Medias,Files)放入SendReq的方法PduPart,PduBody,把SendReq写入数据库和从数据中读取SendReq—通过PduPersister。客户端的应用程序,只是创建SendReq,用提供的方法把数据写入SendReq中,用PduPersister来写入数据库和从数据库中提取,最后用HTTP协议把SendReq发送出去。

同时还有一个专门的类DraftCache用来管理哪些Thread含有草稿,它的内部是一个HashMap,可以标识哪些Therad含有草稿。所以,在对草稿操作的地方都会用到DraftCache,如果一个Thread含有草稿,就需要把它的ThreadId标识为有草稿;如果一个Thread的信息已发送出去,就要把它标识为不含有草稿。

传统的以文件夹方式管理信息都会有一个专门用于存放草稿的文件夹叫草稿箱。每次编辑信息,无论是发给哪个人,都可以放入这草稿箱。但是这里也可以发现,与传统的以文件夹方式不同,Android中的Mms的草稿是每个Thread一个,而且只有一个,换句话说,不可能存储太多的草稿。因为Android中的Mms是以对话Thread方式来管理信息的,而一个Thread,一次对话,只应该有一个没“说完”的话,所以这种设计也是合常理的。

(0)

相关推荐

  • Android编程之非调用系统界面实现发送彩信的方法(MMS)

    本文实例讲述了Android非调用系统界面实现发送彩信的方法.分享给大家供大家参考,具体如下: 一.问题: 最近有个需求,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(phoneCode, null, text, null, null); 二

  • Android Mms之:深入MMS支持

    Composing and editingMMS在Android Mms应用里面的具体实现形式,或数据结构是SlideshowModel,它是一个每个节点为SlideModel的ArrayList,SlideModel是一个Model的List,也就是它可以接收任何Model的子类,Audio,Video,Image和Text都可以放到SlideModel上面.SlideModel主要用于管理其上面的各个媒体,比如它们的布局,它们的播放控制,而SlideshowModel主要用于管理所有的附件,

  • Android开发中使用mms模块收发单卡和双卡短信的教程

    一.信息发送: com.android.mms.data.WorkingMessage.java 类 send()函数: public void send() { ...... if (requiresMms() || addressContainsEmailToMms(conv, msgTxt)) { // 彩信 slideshow.prepareForSend(); new Thread(new Runnable() { public void run() { sendMmsWorker(c

  • Android Mms之:对话与联系人关联的总结详解

    在Mms中每个Thread都有其相应的联系人,但是threads表中并没有直接保存联系人的信息(号码或名字),而是保存一个叫做recipient_id的东西,也还有一个类叫做data/RecipientIdCache.java专门管理它. 在数据库中专门有一个表来保存它canonical_addresses.它的目的就是为了能够快速的找到某一对话的联系人的信息.对话的表threads里面并没有保存其联系人的直接信息,而是有一列叫做recipient_ids的整数来代表收信人.而在数据库还有另外一

  • Android Mms之:短信发送流程(图文详解)

    信息的发送,对于Mms应用程序来讲主要就是在信息数据库中创建并维护一条信息记录,真正的发送过程交由底层(Frameworks层)函数来处理. 总体的来讲,当信息创建完成后,对于信息通常有三个去处,一个是放弃这个信息,也就是用户不想要此信息,一旦选择,信息将不会被保存:第二个去处就是保存为草稿:最后一个去处就是发送此信息. 当点击了发送后,UI层暂不会有变化,UI层要监听负责发送的各个类的回调信息和数据库的变化信息来更新UI.信息发送的第一站是WorkingMessage,它会先处理一下信息的相关

  • 简单掌握Android开发中彩信的发送接收及其附件的处理

    一. 彩信发送:   彩信比短信麻烦很多.从sendMmsWorker函数的参数就可以看出来:(conv, mmsUri, persister, slideshow, sendReq) 上下文,uri,PduPersister(彩信是用pdu的),slideshow 包含了所有的彩信信息,sendreq包含了mime封装mms时的headers,也包括了from,to等信息 . (1)函数 sendMmsWorker: private void sendMmsWorker(Conversatio

  • Android Mms之:深入理解对话列表管理

    Conversation这个类主要表示对话的数据结构,其内持有一个Thread所有的相关信息,如Recipients,ThreadId等等,也用于管理Thread,比如查询Thread,删除Thread,更新Thread,管理ThreadId,管理Thread的联系人等等.因为Thread表与其他表关联的信息比较多,如联系人,消息个数,这些信息有些直接会写在数据库.因为Thread上面的信息比较多,所以加载时会较费时,因此就有了一个在Conversation内部的Cache来提高加载Thread

  • Android Mms之:PDU的使用详解

    Android当中的Mms对MMS(Multimedia Messaging Service)的操作关乎MMS协议部分都是通过Frameworks中提供的API来完成的:com.google.android.mms这个包在SDK中是不开放的,只能供内部程序使用,它封装了所有MMS所需要的API.这个包就是Android中对MMS协议的实现,包括一些数据结构:GenericPdu,MultimediaMessagePdu,SendReq,SendConf,NotificationInd,Retri

  • Android Mms之:深入理解Compose

    Mms中的ComposeMessageActivity(以下简称Composer)是整个Mms中最重要的一个组件,它负责编辑信息,发送信息,管理信息,接收信息,与外部应用接口.在Mms内部与Composer关联的类和组件特别多,几乎所有的类和组件都与Composer有关联,关于信息的所有操作流程都起始于Composer:在外部Composer也是公开的接口,能够处理Intent.ACTION_SEND和Intent.ACTION_SENDTO以及文件类型为audio/*,image/*,vide

  • Android Mms之:接收信息流程(图文详解)

    信息的接收工作是由底层来完成的,当有一个 新的信息时底层完成接收后会以Intent的方式来通知上层应用,信息的相关内容也包含在Intent当中,Android所支持的信息Intent都定义在android.provider.Telephony.Intents里面.短信的接收 短信接收,对于上层应用程序来讲就是要处理广播事件SMS_RECEIVED_ACTION,它是由Frameworks发出告诉上层有新的SMS已收到.在Mms中,是由PrivilegedSmsReceiver来处理,它收到SMS

  • Android Mms之:联系人管理的应用分析

    Contact联系人对Mms来说是十分重要的,因为每一个对话的收信人都是一个联系人,新建信息时可以输入联系人的任何信息,比如号码或名字,Mms都可以把信息发给相应的人.Mms中的类Contact就是用来代表一个联系人,它含有联系人的信息,如名字,号码,联系人Id,是否存在于联系人数据库等等,同时Contact也提供了一些方法来获取Contact对象,Contact.get()方法来获取Contact对象.Contact会保持数据与联系人数据库的同步,有一个接口updateContact()用于通

随机推荐