高通android 7.0短信草稿保存流程

2024-03-15 00:08

本文主要是介绍高通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。

所以短信保存草稿的流程还是很简单的。

这篇关于高通android 7.0短信草稿保存流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810158

相关文章

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存