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

相关文章

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla