高通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

相关文章

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

使用JavaConfig配置Spring的流程步骤

《使用JavaConfig配置Spring的流程步骤》JavaConfig是Spring框架提供的一种基于Java的配置方式,它通过使用@Configuration注解标记的类来替代传统的XML配置文... 目录一、什么是 JavaConfig?1. 核心注解2. 与 XML 配置的对比二、JavaConf

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I