Android Mms之:草稿管理的应用_Android

当编辑完一条信息后,如果在没有发送的情况下退出编辑页面,那么信息会自动保存为草稿。也就是在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,一次对话,只应该有一个没“说完”的话,所以这种设计也是合常理的。

时间: 2024-09-16 13:27:23

Android Mms之:草稿管理的应用_Android的相关文章

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

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

Android中创建多线程管理器实例_Android

如果你要反复执行一个任务,用不同的数据集(参数不同),但一次只要一个执行(任务是单线程的),IntentService符合你的需求.当需要在资源可用时自动执行任务,或允许多任务同时执行,你需要一个线程管理器管理你的线程.ThreadPoolExecutor,会维护一个队列,当它的线程池有空时,从队列里取任务,并执行.要运行任务,你要做的就是把它加到队列里. 线程池可以并联运行一个任务的多个实例,所以你要保存代码线程安全.能被多线程访问的变量需要同步块.更多信息,见Processes and Th

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

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

Android Mms之:PDU的使用详解_Android

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之:短信发送流程(图文详解)_Android

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

Android activity堆栈及管理实例详解_Android

本示例演示如何通过设置Intent对象的标记,来改变当前任务堆栈中既存的Activity的顺序. 1. Intent对象的Activity启动标记说明: FLAG_ACTIVITY_BROUGHT_TO_FRONT 应用程序代码中通常不设置这个标记,而是由系统给单任务启动模式的Activity的设置. FLAG_ACTIVITY_CLEAR_TASK 如果给Intent对象添加了这个标记,那么在Activity被启动之前,会导致跟这个Activity关联的任何既存的任务都被清除.也就是说新的Ac

Android Mms之:深入理解Compose_Android

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

Android Mms之:深入MMS支持

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

Android Mms之:深入理解Compose

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