为什么Android数据应该在onPause()-onResume()中提交/读取,而不是在onStop()-onStart()中提交/读取?

为什么Android数据应该在onPause()-onResume()中提交/读取,而不是在onStop()-onStart()中提交/读取?,android,android-activity,Android,Android Activity,文档建议在onPause()/onResume()中提交/读取数据 然而,当应用程序不再位于前台时,其数据结构保持不变,这表明可以延迟提交/读取数据,直到应用程序不再可见,即在onStop()/onStart()中。特别是因为onStop()保证在onDestroy()之前被调用 这两种方法是否都适用?这里提供的文件仅仅是一个指南吗 更新 假设您的应用程序需要保存相对大量的数据,例如对大型图像的编辑。因此,人们肯定不会在onPause()/onResume()中写入/读取,以免用户体验变得迟钝。

文档建议在
onPause()
/
onResume()
中提交/读取数据

然而,当应用程序不再位于前台时,其数据结构保持不变,这表明可以延迟提交/读取数据,直到应用程序不再可见,即在
onStop()
/
onStart()
中。特别是因为
onStop()
保证在
onDestroy()之前被调用

这两种方法是否都适用?这里提供的文件仅仅是一个指南吗

更新
假设您的应用程序需要保存相对大量的数据,例如对大型图像的编辑。因此,人们肯定不会在
onPause()
/
onResume()
中写入/读取,以免用户体验变得迟钝。在这种情况下,可以选择在
onStop()
/
onStart()
中写入/读取。这是真的吗?

是的,这只是一个指南(通常是一个好的指南)。何时提交更改完全取决于您。我个人喜欢创建允许简化数据库或共享引用的存储对象,当进行更改时,我会立即提交这些更改。对于简单的数据存储,这将是快速和不可见的用户。对于大型数据集,这可能需要更多的时间,您可能希望在一个时间间隔以及onPause中进行这些写入

至于何时阅读——您可以在任何时候阅读,但是较长的阅读时间通常会影响用户体验,除非您在另一个线程(例如异步任务)中进行了处理

进一步回答您的更新:
这取决于开发人员,但是我会在
onPause()
中编写,如果需要,在单独的线程中读取,可能会用
onResume()初始化。我也可以使用
定时器
线程按预定时间间隔写入数据,这取决于它对当前会话的用户体验的影响,以及手机在
onPause()之前关闭并丢失所有数据是否会造成灾难
被调用。

在顶部使用
的问题在于,您无法保证何时调用它,因为唯一可以确定的是它将在
onDestroy
之前被调用。如果您等到
onStop
提交数据,则另一个活动显示/使用这些更改可能会延迟。同样的情况也适用于
onStart
,如果您的活动只是在后台,则可能不需要重新启动,这样您将拥有过时的数据。使用
onResume
onPause
可以确保您的数据始终是最新的,一旦活动进入后台,就会进行提交,并且一旦看到新数据,就会加载新数据

真正的答案是,onPause是保证在Android破坏您的进程之前,您会被调用的唯一方法。如果用户离开你的应用程序接听电话,而Android决定关闭你的进程,那么你只接听暂停通话是完全合法的。如果您没有在此处保存状态,当用户单击“上一步”按钮时,您将以与用户保留状态不同的状态重新创建活动。

谢谢。你证实了我的预感。与其就这两种方法的优点开始一个续集问题,不如让我稍微编辑一下这个问题。@Calaf,请创建一个新帖子。不赞成把这个问题改成新问题。它不仅完全改变了原来的问题,而且也改变了原来的回答。我确保更新与最初的问题不同。因此,你的回答仍然有效和中肯。这一更新提供了一个例子,说明一种方法优于另一种方法。这非常有意义。让我重新措辞以确保我理解。如果应用程序由单个活动组成,则完全适合使用可见循环或前台循环进行读/写。如果应用程序由两个或多个将读取彼此数据的活动组成,则有必要使用可见循环。对于其他每一个场景,程序员都可以自由选择,这没有什么区别。你同意吗?差不多。开发人员有责任确保数据的一致性。该框架为生命周期的不同阶段提供了入口点,您应该为您的案例选择最佳入口点。了解每个阶段之间的差异至关重要。另一方面,任何耗时的操作(如保存大量数据)都应该在ui线程之外处理,在这种情况下,使用
AsyncTask
是一个很好的解决方案。您的推理完全符合Android的建议,即使用onPause()而不是onStop()编写。但它也直接与活动生命周期图()相矛盾。您或任何人愿意详细说明吗?它不是真的:“如果某个活动被暂停或停止,系统可以通过要求其完成或简单地终止其进程来从内存中删除该活动。当它再次显示给用户时,必须完全重新启动并恢复到以前的状态。”如果进程被终止,其余的事件将不被调用。当您的流程恢复时,您仍然需要恢复到用户友好的状态。您确实是对的。您的引号表示可以在不首先调用onStop()的情况下终止活动。(是否也可以跳过onDestroy()还不太清楚。)如果这是真的,则该图相当误导。onDestroy也可以跳过。然而,我99%确定,图表唯一的误导方式是在onPause之后直接终止进程。换句话说,图形和生命周期总是遵循的,除非Android不得不终止你的进程,因为内存压力就是这个