我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android Mms之:深入理解Compose

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android Mms之:深入理解Compose

Mms中的ComposeMessageActivity(以下简称Composer)是整个Mms中最重要的一个组件,它负责编辑信息,发送信息,管理信息,接收信息,与外部应用接口。在Mms内部与Composer关联的类和组件特别多,几乎所有的类和组件都与Composer有关联,关于信息的所有操作流程都起始于Composer;在外部Composer也是公开的接口,能够处理Intent.ACTION_SEND和Intent.ACTION_SENDTO以及文件类型为audio/*,image/*,video/*和text/*。
Composer是一个标准的Activity,它的启动流程也要经过onCreate(), onStart(),onResume(),销毁流程要经过onPause(),onStop()和onDestroy() 。除此之外,其他的操作都要经过用户来触发,或者由其他事件,比如新来信息,数据库变化等。
初始化流程
Composer的初始化流程要做的事情有初始化UI,注册一些Receiver和Listener,初始化Conversation和WorkingMessage,查询信息等。其中,初始始化Conversation和WorkingMessage是最重要的,因为UI和一些操作要依赖于Conversation是否存在,以及消息数量和是否有草稿。所以这里我们主要讨论初始化Conversation和WorkingMessage。
初始化的主要流程都是在initialize()函数中进行的,这里也主要解析下initialize()函数。initialize()最先要做的就是初始化WorkingMessage,创建一个新的WorkingMessage对象mWorkingMessage;然后就是根据Intent和Bundle来初始化Conversation,这一过程相当重要,因为Conversation对象含有这一会话的所有重要数据,包括是否有草稿,信息的数量,是新建的信息还是已有信息,这些信息都将影响后续的初始化工作。
initActivityState()主要看二个参数一个是所传入的Bundle另一个就是Intent。它会优先查看Bundle,如果Bundle对象不为空的话,会从Bundle之中取出一些状态,比如收信人recipients,比如退出状态exit_on_sent等。根据所拿出来的的收信人就可以用Conversation的get()方法来获取Conversation对象mConversation,之后便会让mWorkingMessage从Bundle中读取相关的数据。其实,这里从Bundle中初始化是与onSaveInstanceState()相对应的,在onSaveInstanceState()中会保存recipients和让mWorkingMessage写数据到Bundle中,以保存Activity的状态。总体来讲,onSaveInstanceState是保存Activity的状态,而initActivityState()中当Bundle不为空时是恢复Activity的状态。
如果Bundle对象为空的话,那么就从Intent中来初始化相关的数据,这也是大多数的情况所走的逻辑。首先是检查Intent中是否有thread_id和address,也直接从Intent的Uri中搜寻收信人的相关信息,以便用Conversation.get()来获取Conversation对象mConversation。之后还会试图从Intent中获取其他信息比如消息的主体sms_body,主题subject等。
调用完initActivityState()以后,mWorkingMessage和mConversation二个对象应该都被正确的初始化了。这时候就要处理特殊的Intent:ACTION_SEND和Forward了。先是处理ACTION_SEND,这是对外的接口,当外部程序想通过MMS来发送文本(text/*),图片(image/*),音频(audio/*)和视频(video/*)时就会通过Intent.ACTION_SEND来发送。对于这个Intent的处理很简单就是把相关文件的Uri,通常放在intent.getExtras(Intent.EXTRA_STREAM)中,把Uri加载为附件,也可以通过Intent.SEND_MULTIPLE来处理多个附件,但是逻辑是一样的。Forward是Intent当中有forward_message时,同时取出另外二个选项,一个是要转发的信息的Uri,一个是主题subject和消息主体sms_body。因为对于SEND和Forward都仅指定信息的内容而没有指定收信人,所以mConversation对象是没有实际内容的,它们都会与新建信息是一样的,只不过有信息的内容。
除了ACTION_SEND和Forward的信息有内容外,其他的信息都需要检查是否有草稿,以便能加载草稿。加载草稿是由m WorkingMessage.loadDraft()来完成的,它会检查mConversation的状态,如果有草稿存在就从数据库中加载出来。
到此,初始化的关键操作都已完成,数据的加载都已完成,剩下的工作就是根据这些数据来初始化UI,比如是否显示收信编辑栏等。
销毁流程
Composer的销毁要做的只有二件事,一个是保存当前编辑的信息内容,也就是保存草稿,如果有的话;另一个就是通过onSaveInstanceState来保存状态,不过这个通常用不到,只有当Composer被系统杀掉并希望重启时才会调用到。
保存草稿的工作主要放在onStop()的时候,所以每当用户离开Composer页面都会走进onStop()也就都会检查相关的条件以确定是否要保存草稿。保存草稿的条件有三个:信息有内容(mWorkingMessage.isWorthSaving(),有内容,有主题,有附件均可),并且信息有正确的收信人(在不在数据库中均可),还有就是Composer在等待其他Activity(这个通常出现在添加联系人或添加草稿过程中,因为要跳转到其他Activity,所以Composer也会走到onStop(),但是这个时候因为信息还在编辑中,所以就需要保存草稿)。如果以上条件不满足就丢弃信息内容(mWorkingMessage.discard()),否则就保存草稿(mWorkingMessage.saveDraft())。
对外公开的接口
跟Android中组件复用的公开接口一样,Composer对外公开的接口也是通过处理Intent来完成的,主要是二个Intent一个是Intent.ACTION_SEND,另一个就是Intent.ACTION_SENDTO。接口的声明处是在AndroidManifest文件中的IntentFilter。对于处理,有二个地方,一个是在initActivityState()中,会从Intent中尝试取出address, sms_body 和subject;另外对于ACTION_SEND需要明显的处理handleSendIntent(),因为需要从Intent中取出信息的内容通常都是多媒体文件,取出多媒体文件然后通过mWorkingMessage.setAttachment()添加为信息的附件。
还有一个接口就是对于分享联系人,分享联系人的方式是把联系人的信息作为短信的内容发送出去。这个过程实际上是由Contacts中的ShareContactsViaSMS来先行处理,它会把联系人的信息从数据库中读取出来,然后拼成一个字串再用Intent当成sms_body传给Mms发送。
与其他组件的交互
Composer在编辑信息过程中,特别是编辑MMS的过程中需要不断的与其他组件进行交互,比如添加图片,添加音频,添加视频或拍摄图片,拍摄视频等。对于选择图片,选择视频来讲是通过与Gallery应用进行交互,发送GET_CONTENT的Intent给Gallery,Gallery会列出图片和视频供用户选择,当用户选择后,Gallery会把用户所选择的图片或视频的Uri传给Composer,之后Composer就用传过来的Uir进行添加附件的动作。对于音频是与Music应用进行交互,逻辑类似。对于拍摄图片和拍摄视频和录制音频流程稍有不同。拍摄图片和拍摄视频在请求Intent中要指定输出的路径通过Intent.EXTRA_OUTPUT来指定输出Uri。Camera在拍摄的过程中会把数据写在所指定的Uri中,之后Composer会直接从这个Uri中读取文件(这里与2.3不同,2.3是Camera把文件的Uri放在Intent中)。TempFileProvider就专门用于管理拍摄图片和拍摄视频时临时存储数据的。传给Camera的Uri是”content://mms_temp_file/scrapSpace”,这个Uri由TempFileProvider来管理,由Camera来使用,当Camera要写数据时openFile()时,TempFileProvider就会创建一个临时文件,在外部存储卡上/sdcard/Android/data/com.android.mms/mms_temp_file/scrapSpace/.temp.jpg,Camera所拍摄的图片和视频都存放在这个文件之中。TempFileProvider中还有方法以操作这个文件,比如TempFileProvider.renaceScrapFile()就是把.temp.jpg文件重命名成为一个.3gp的视频。除了Composer会用到这个TempFileProvider,在SlideEditorActivity� �编辑一张幻灯片的时候也会用到这个临时文件,因为编辑幻灯片的时候也是能够通过Camera来添加图片的视频的。

您可能感兴趣的文章:Android编程之非调用系统界面实现发送彩信的方法(MMS)Android开发中使用mms模块收发单卡和双卡短信的教程Android Mms之:短信发送流程(图文详解)Android Mms之:接收信息流程(图文详解)Android Mms之:草稿管理的应用Android Mms之:深入MMS支持Android Mms之:联系人管理的应用分析Android Mms之:深入理解对话列表管理Android Mms之:对话与联系人关联的总结详解Android Mms之:PDU的使用详解简单掌握Android开发中彩信的发送接收及其附件的处理


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android Mms之:深入理解Compose

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android Mms之:深入理解Compose

Mms中的ComposeMessageActivity(以下简称Composer)是整个Mms中最重要的一个组件,它负责编辑信息,发送信息,管理信息,接收信息,与外部应用接口。在Mms内部与Composer关联的类和组件特别多,几乎所有的类
2022-06-06

Android Mms之:深入MMS支持

Composing and editingMMS在Android Mms应用里面的具体实现形式,或数据结构是SlideshowModel,它是一个每个节点为SlideModel的ArrayList,SlideModel是一个Model的Li
2022-06-06

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

Conversation这个类主要表示对话的数据结构,其内持有一个Thread所有的相关信息,如Recipients,ThreadId等等,也用于管理Thread,比如查询Thread,删除Thread,更新Thread,管理ThreadI
2022-06-06

Android Mms之:草稿管理的应用

当编辑完一条信息后,如果在没有发送的情况下退出编辑页面,那么信息会自动保存为草稿。也就是在ComposeMessageActivity的onStop()时,如果还没有发送,那么就会调用WorkingMessage.saveDraft()来把
2022-06-06

Android Mms之:PDU的使用详解

Android当中的Mms对MMS(Multimedia Messaging Service)的操作关乎MMS协议部分都是通过Frameworks中提供的API来完成的:com.google.android.mms这个包在SDK中是不开放的
2022-06-06

android ListView深入理解

在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。抽空把对ListView的使用做了整理,并写了个小例子,如下图。 列表的显示需要三个元素: 1.ListVeiw 用来展示
2022-06-06

深入理解Android之接口回调机制

刚开始学对于这个机制理解不够深刻,现在重新整理下思路。开发中,接口回调是我们经常用到的。 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行。首先解决啥是回调:举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方
2022-06-06

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

信息的接收工作是由底层来完成的,当有一个 新的信息时底层完成接收后会以Intent的方式来通知上层应用,信息的相关内容也包含在Intent当中,Android所支持的信息Intent都定义在android.provider.Telephon
2022-06-06

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

信息的发送,对于Mms应用程序来讲主要就是在信息数据库中创建并维护一条信息记录,真正的发送过程交由底层(Frameworks层)函数来处理。 总体的来讲,当信息创建完成后,对于信息通常有三个去处,一个是放弃这个信息,也就是用户不想要此信息,
2022-06-06

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

Contact联系人对Mms来说是十分重要的,因为每一个对话的收信人都是一个联系人,新建信息时可以输入联系人的任何信息,比如号码或名字,Mms都可以把信息发给相应的人。Mms中的类Contact就是用来代表一个联系人,它含有联系人的信息,如
2022-06-06

Android开发之文件操作模式深入理解

一、基本概念 代码如下: // 上下文对象 private Context context; public FileService(Context context) { super(); this.context = context; }
2022-06-06

Android开发笔记之:深入理解多线程AsyncTask

Understanding AsyncTaskAsyncTask是Android 1.5 Cubake加入的用于实现异步操作的一个类,在此之前只能用Java SE库中的Thread来实现多线程异步,AsyncTask是Android平台自己
2022-06-06

Android 中ThreadLocal的深入理解

ThreadLocal前言: ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储
2023-05-30

深入理解python之一——python

文章使用markdown写的,编辑的时候行间距还可以,显示的时候行间距好小,我也没办法。首先,需要明白的是python是一种解释性语言标准,他可以由c、java或者其他语言来实现。在python的标准中,变量是链接式的。举个例子来说,内存中
2023-01-30

深入理解Android手势识别

对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理。不过,为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录