17

我知道这个问题已经被问过一百万次了,尽管我自己已经知道答案,而且正确的答案是唯一有保证的调用是 onPause(),所以你应该把你的数据保存在那里。

然而,在许多 android 文档的地方,他们总是建议不要在 onPause() 方法中做繁重的工作(例如在数据库中写入数据),因为它会延迟活动之间的转换。

根据表 1 中的 Android 开发人员指南

onPause():此方法通常用于提交对持久数据的未保存更改、停止动画和其他可能消耗 CPU 的事情等。它应该很快地做任何事情,因为下一个活动在它返回之前不会恢复。

可杀:是

然后根据类似表格中的 Android Developer Reference Guide 进行操作。

它说的是同样的事情,但是:

可杀:预蜂巢

他们添加了一个小注释,上面写着:

请注意,这些语义将在针对以 HONEYCOMB 开头的平台的应用程序与针对先前平台的应用程序之间略有不同。从 Honeycomb 开始,应用程序在其 onStop() 返回之前不会处于可终止状态。这会影响何时可以调用 onSaveInstanceState(Bundle)(它可以在 onPause() 之后安全地调用,并允许应用程序安全地等到 onStop() 以保存持久状态。


可杀

请注意上表中的“Killable”列——对于那些被标记为可终止的方法,该方法返回后,托管该活动的进程可能随时被系统终止,而无需执行另一行代码。

FOR POST-HONEYCOMB(我不关心早期版本): 那么,可以假设任何 Android 设备(包括不同的 ROMS)都会确保在活动中调用 onStop 吗?这是进行任何耗时的应用程序存储写入的最佳场所吗?

注意:这非常令人困惑,因为这里的大多数答案、网站、书籍甚至在线 android 测试都将其作为正确答案,您应该将其保存在 onPause 而不是 onStop 中。

4

3 回答 3

19

何时将数据保存到数据库,onPause() 或 onStop()?

任何一个。它们几乎相同,尤其是在 Android 3.0+ 上。

如果占据前台的activity是典型的全屏activity,那么之前的activity就不再可见,onPause()onStop()被快速连续调用。

如果接管前台的活动的主题更像是一个对话框,其中较早的活动仍然可见,onPause()将被调用,但不是onStop(),直到活动不再可见(例如,用户现在按下 HOME )。

大多数应用程序并不担心“主题更像一个对话”场景,在这种情况下onPause()onStop()在下一个之后立即调用,您可以分叉后台线程以将数据保存在对您有意义的任何一个中.

然而,在许多 android 文档的地方,他们总是建议不要在 onPause() 方法中做繁重的工作(例如在数据库中写入数据),因为它会延迟活动之间的转换。

也是如此onStop(),因为这两个方法都是在主应用程序线程上调用的。

那么,是否可以假设任何 Android 设备(包括不同的 ROMS)都会确保在活动中调用 onStop?

从进程终止的角度来看,两者onPause()onStop()将具有相同的特征。要么两者都被调用(正常情况),要么都不被调用(例如,你崩溃了,电池从手机背面弹出)。

这是进行任何耗时的应用程序存储写入的最佳场所吗?

要么 要么onPause()onStop()触发工作的好地方,在后台线程上完成,以保留您的数据。如果您更喜欢在 中进行这项工作onStop(),那么绝对欢迎您这样做。就个人而言,我是onPause()那种人。

于 2015-04-07T16:24:34.520 回答
1
  • 如果您想要更安全,请存放在onPause.
  • 如果您的数据太大以至于您必须将其存储几秒钟,您可以打开一个后台Service(例如IntentService)进行保存。
  • 您还可以检查代码中的系统版本并选择何时保存。if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.ICE_CREAM_SANDWICH){}
  • 在大多数情况下,某些自定义操作系统不会更改此保存时间的规则。但是当然可以有一些其他的操作系统肯定会改变它。所以在android开发中最重要的是你需要知道在不同的手机上一切都可能不同。
于 2015-04-06T22:48:20.910 回答
1

我知道这个问题是史前的,但像我这样的人似乎仍然碰巧落在这个问题上。所以我想添加我在文档中找到的答案可能是有意义的,其中指出:

要保存持久性数据,例如用户偏好或数据库数据,您应该在活动处于前台时采取适当的机会。如果没有这样的机会出现,您应该在 onStop() 方法期间保存这些数据

资源

但是等等,还有更多:

请注意上表中的“Killable”列——对于那些标记为可终止的方法,在该方法返回后,托管该活动的进程可能随时被系统终止,而无需执行另一行代码。因此,您应该使用 onPause() 方法将任何持久性数据(例如用户编辑)写入 storage

资源

所以总结起来,似乎持久化数据 onPause() 是最好的做法。

于 2020-07-22T09:07:09.800 回答