我目前将Activity
的应用数据存储在Parcelable
对象中。在方向更改时,我将其保存并使用onSaveInstanceState
和onRestoreInstanceState
加载。
我想在用户退出活动时将数据保存到数据库。
而且,我想最小化数据库调用。所以,
我应该在哪里编写代码来将数据保存到数据库中?是onPause()
,onResume()
,onStop()
还是onDestroy()
?
答案 0 :(得分:2)
我目前在Parcelable对象中存储Activity的应用数据
由于您的其余问题是关于数据库I / O,请注意Parcelable
与数据库I / O无关。
我想在用户退出活动时将数据保存到数据库中。
我建议您在数据更改时保存数据,而不是等待并冒着丢失数据的风险(例如,应用程序崩溃)。
是onPause(),onResume(),onStop()还是onDestroy()?
不是onResume()
。该生命周期方法被称为进入屏幕的活动的一部分,而不是在活动离开时。
不是onDestroy()
,因为无法保证会调用onDestroy()
。
其他两个都是合理的。主要区别在于可见性:
如果某个活动占据了前景,但该活动的主题是对话框或以其他方式允许您的活动查看,则只会暂停
如果某个活动占用了前景,并且您的活动不再可见,则会暂停然后停止
答案 1 :(得分:2)
如果你真的在谈论最佳实践,那么以上都不是。 活动是视图层对象。有些人可能认为它是混合控制器和视图。在任何一种情况下,它都不是模型或业务层对象。
如果您的数据足够重要,可以写入数据库,那么我猜测它不是视图状态,它可能是域数据。因此,最佳做法是让Model / Business层(与Activity完全分离)处理它。考虑到移动应用程序的本质,我会在数据发生变化时写入数据库(当然是异步的),而不考虑各种Android组件的生命周期。
答案 2 :(得分:1)
对接受的答案进行更正:(我很惊讶Mark Murphy!)
来自活动生命周期的android文档:
onPause()执行非常简短,并不一定能提供 有足够的时间执行保存操作。为此原因, 你不应该使用onPause()来保存应用程序或用户 数据,进行网络调用或执行数据库事务;