在activity的onDestroy方法中保存数据

10

我正在编写一个任务列表,有一个项目对象来保存所有的任务和相关信息。我使用操作日志,所以当任务发生变化时,我不会立即将其保存到数据库中,只是在内存中保留以便在活动结束时转储到数据库中。活动的onDestroy方法是最好的地方:如果没有调用onRetainNonConfigurationInstance方法,我就启动服务来保存项目(一个实例存储在应用程序中)。保存是昂贵的:在数据库中,项目有版本,因此我保存新数据,更改当前版本并删除之前版本的数据。这样我就不必担心突然停止应用程序。

但是,根据文档,我不能把这个方法视为保存数据的地方。

是否有其他替代方法来保存我的数据?

4个回答

21

onDestroy方法并不总是会被调用。来自生命周期文档的说法如下:

当您的活动接收到停止(onStop)方法的调用时,它不再可见,并且应该释放所有在用户不使用它时不需要的几乎所有资源。一旦您的活动被停止,如果需要恢复系统内存,系统可能会销毁实例。在极端情况下,系统可能会仅仅杀死您的应用程序进程而不调用活动的最终onDestroy()回调,因此使用onStop()释放可能泄漏内存的资源非常重要。

虽然在onStop()之前会调用onPause()方法,但是您应该使用onStop()来执行更大、更耗费CPU的关闭操作,例如将信息写入数据库。

请参阅停止您的活动


OnStop() 中保存您的数据。它将始终被调用。 - iagreen
onStop在onRetainNonConfigurationInstance之前调用,因此我可能不知道它是正在结束活动还是仅仅是方向更改。 - ryabenko-pro
2
这是正确的。在配置更改时对数据进行检查点的缺点是什么?您可以通过将android:configChanges =“keyboardHidden | orientation或类似内容添加到清单中来自己处理配置更改。请参阅此问题/答案以了解其利弊。 - iagreen
另一个选项是,如果您正在使用片段,则可以在配置更改时保留具有操作日志的片段。 - iagreen
1
@iagreen,OnStop()方法并不总是会被调用。虽然我们应该在这里保存数据、释放内存,但需要注意的是,在低内存情况下,当系统在调用onPause()方法后无法保持您的活动进程运行时,该方法可能永远不会被调用。 - Nguyen Minh Binh

4

您不应该使用onDestroy()方法来保存数据。相反,您应该使用内部/外部存储空间或在onPause()方法中编写代码。


1
onPause可能会被频繁调用,而保存过程是昂贵的。 - ryabenko-pro

3

你应该使用onStop

Activity文档

你也可以使用onPause,但这会在你离开Activity时调用,包括关闭屏幕。


onStop在onRetainNonConfigurationInstance之前调用,因此我可能不知道它是正在结束活动还是仅仅是方向更改。 - ryabenko-pro
1
我不完全明白为什么你不在活动运行时直接写入数据库...你可以在单独的线程中执行此操作,并使用加载器API确保所有内容同步...这似乎是更好的设计模式。按照你的方式,你总是冒着人们关闭手机或操作系统积极回收内存等风险。 - Sam Dozor
我使用操作日志记录,因此突然的应用程序终止不是问题。可能我会在活动运行时使用一些定时器并周期性地存储数据。 - ryabenko-pro

2
根据 Activity Lifecycle文档,您应该在onPause()onSaveInstanceState(Bundle)中保存数据。请注意,在活动关闭之前,onDestroy()onStop()方法可能永远不会被调用。
以下是来自Activity Lifecycle文档的摘录:

protected void onDestroy ()

注意:不要指望这个方法作为保存数据的地方!例如,如果一个活动正在编辑内容提供程序中的数据,则应该在onPause()onSaveInstanceState(Bundle)中提交这些编辑,而不是在此处。

protected void onStop ()

请注意,在低内存情况下,系统在调用其onPause()方法后,可能永远不会调用此方法,因为系统没有足够的内存来维持您的活动进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接