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

时间:2015-04-06 22:43:13

标签: android android-activity android-lifecycle android-database

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

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

根据Android Developer Guide in Table 1

  

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

     

Killable:是的

然后根据Android Developer Reference Guide in the similar table

它说同样的事情,但是:

  

Killable:Pre-HONEYCOMB

他们还添加了一个说明:

  

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


Killable

  

请注意上表中的“Killable”列 - 对于标记为可填充的方法, 之后该方法返回托管活动的进程可能随时被系统杀死而没有正在执行另一行代码。

FOR POST-HONEYCOMB(我不关心早期版本): 那么,可以假设任何Android设备(包括不同的ROMS)都能确保在活动上调用onStop吗?这是一个最好的地方,可以花费任何时间来存储App的存储空间吗?

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

3 个答案:

答案 0 :(得分:16)

  

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

要么。它们几乎完全相同,特别是在Android 3.0 +上。

如果接管前景的活动是典型的全屏活动,以便不再显示早期活动,则会快速连续调用onPause()onStop()

如果接管前景的活动主题更像是对话框,之前的活动仍然可见,则会调用onPause(),但不会调用onStop(),直到活动不再可见(例如,用户现在按HOME)。

大多数应用并不担心主题更像是一个对话框"方案,在这种情况下,onPause()onStop()在下一个方法之后被调用,您可以分叉后台线程以将数据保存到对您有意义的任何一个方面。

  

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

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

  

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

从流程终止的角度来看,onPause()onStop()都具有相同的特征。两者都应该被调用(正常情况)或两者都不会被调用(例如,你崩溃,电池弹出电话背面)。

  

这是使用App存储编写的最佳时间吗?

onPause()onStop()是触发工作的好地方,在后台线程上完成,可以保留您的数据。如果您希望在onStop()中完成这项工作,我们绝对欢迎您这样做。就个人而言,我是onPause()类型的人。

答案 1 :(得分:1)

我知道这个问题是史前的,但似乎像我这样的人仍然碰巧遇到了这个问题。因此,我认为添加我在文档中找到的答案可能是有道理的:

要保存持久性数据(例如用户首选项或数据库数据),则当活动处于前台时,应抓住适当的机会。如果没有这样的机会,您应该在onStop()方法期间保存此类数据

source

但是等等,还有更多

请注意上表中的“可杀死”列-对于那些标记为可杀死的方法,该方法返回后,承载活动的进程可能会随时被系统杀死,而无需另外编写一行代码被执行。因此,您应该使用onPause()方法将所有持久性数据(例如用户编辑内容)写入存储空间。

source

因此,总结起来,似乎最好将数据保留在onPause()上。

答案 2 :(得分:0)

  • 如果您想要更加安全,请存储在onPause
  • 如果您的数据太大而无法将其存储几秒钟,则可以打开后台Service(例如IntentService)进行保存。
  • 您还可以检查代码中的系统版本,然后选择保存的时间。 if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.ICE_CREAM_SANDWICH){}
  • 在大多数情况下,这个保存时间的规则不会被某些自定义的操作系统更改。但当然可能还有其他一些操作系统肯定会改变它。因此,在Android开发中最重要的是你需要知道不同手机中的一切都会有所不同。