如何在生命周期销毁过程中关闭一个Activity?

3
什么是 Android 关闭/结束一个活动并仍希望它经历 onPause、onStop 和 onDestroy 的方法?
我知道 Activity.finish(),但这只能保证调用 onDestroy() 而不是其他两个函数。原因是根据 Android 文档,应在 onStop() 中进行数据库访问,以避免减慢用户的速度,这正是我的意图,将所有“保存”保留到 onStop() 中,然而,我刚刚注意到当调用 finish() 时,该函数并未被调用...
那么... 在这种情况下有什么解决方案?我的意思是,我可以创建一个布尔变量,但是否有更复杂的方法?甚至有另一种结束活动的方法,比如调用 onDestory(),这样做是不正确的吗?
编辑:
抱歉,我打错了那部分,我想说的是在 onStop() 中保存到数据库,而不是在 onDestroy() 中。

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

来源

2个回答

1
Calling Activity.finish 会经历活动生命周期: http://developer.android.com/training/basics/activity-lifecycle/stopping.html 同时,onDestroy() 的文档说明如下:

注意: 不要指望这个方法作为保存数据的地方被调用!

onPause() 的说明如下:
This callback is mostly used for saving any persistent state the activity is editing, to present a "edit in place" model to the user and making sure nothing is lost if there are not enough resources to start the new activity without first killing this one. This is also a good place to do things like stop animations and other things that consume a noticeable amount of CPU in order to make the switch to the next activity as fast as possible, or to close resources that are exclusive access such as the camera.

还有最后一件事,对于onStop()

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

这就只剩下onPause()需要重写并执行一些保存操作。它确实会被调用。

在这里找到了一个相关问题:finish() 和 Activity 生命周期


非常抱歉,我打错了一些东西,我编辑了问题,请再看一下,编辑部分足以看到我的错误。 - LuckyMe
你只剩下这两个选项了。这取决于你的数据库代码有多慢,以及是否重要始终保存数据(因为如果设备内存不足,你的活动将错过onStop调用)。如果只是保存几行数据,我会选择在onPause()中保存以避免用户失去他的工作。 - Trax
好的,但是如果我想从对话框警报中终止活动,我可以强制它通过onStop()吗?因为finish()不会经过onStop(),只会经过onDestroy() - LuckyMe
重新阅读Activity文档,使用onPause()方法:“请注意,在onPause()方法中保存持久化数据非常重要,而不是在onSaveInstanceState(Bundle)方法中保存,因为后者不是生命周期回调的一部分,所以不会像其文档中描述的那样在每种情况下都被调用。” - Trax
是的,文件不是非常清楚关于这些事情。如果您的应用程序非常重,并且在保存到数据库时挂起,您可以尝试在活动的寿命期间进行部分写入。 - Trax
显示剩余4条评论

0
根据文档,“如果系统必须在紧急情况下恢复内存,则可能不会调用onStop()和onDestroy()。因此,您应该使用onPause()将关键的持久数据(例如用户编辑)写入存储器。但是,在onPause()中需要谨慎选择要保留的信息,因为此方法中的任何阻塞过程都会阻止转换到下一个活动并减慢用户体验。”
这意味着,OnPause()是执行数据库操作的正确方法,但如果它们太耗费资源以至于会阻塞UI转换,那么它们只能在OnStop()中完成。

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