【发布时间】:2015-06-11 10:02:27
【问题描述】:
我知道这个问题已经被问过一百万次了,尽管我自己已经知道答案并且正确的答案是唯一有保证的调用是 onPause(),所以你应该把你的数据保存在那里。
然而,在许多 android 文档的地方,他们总是建议不要在 onPause() 方法中做繁重的工作(例如在数据库中写入数据),因为它会延迟活动之间的转换。
根据Android Developer Guide in Table 1
onPause():此方法通常用于提交对持久数据的未保存更改、停止动画和其他可能消耗 CPU 的事情等。它应该很快地完成它所做的任何事情,因为下一个活动在它返回之前不会恢复。
可杀:是
然后根据Android Developer Reference Guide in the similar table.
它说了同样的话,但是:
可杀:预蜂巢
他们添加了一个小注释,上面写着:
请注意,针对以 HONEYCOMB 开头的平台的应用程序与针对先前平台的应用程序之间的这些语义会略有不同。 从 Honeycomb 开始,应用程序在其 onStop() 返回之前不会处于可终止状态。这会影响何时可以调用 onSaveInstanceState(Bundle)(它可以在 onPause() 之后安全调用,并允许应用程序安全地等待 onStop() 以保存持久状态。
可杀
请注意上表中的“Killable”列——对于那些被标记为可杀死的方法,在该方法返回承载活动的进程之后,系统可能随时终止它的另一行代码正在执行。
对于 POST-HONEYCOMB(我不关心早期版本): 那么,可以假设任何 Android 设备(包括不同的 ROMS)都会确保在活动上调用 onStop 吗?而这里是进行任何耗时的 App 存储写入的最佳场所吗?
注意:这非常令人困惑,因为这里的大多数答案、网站、书籍甚至在线 android 测试都将其作为正确答案,您应该将其保存在 onPause 而不是 onStop 中。
【问题讨论】:
-
请参阅developer.android.com/about/dashboards/index.html 了解当前的设备分布情况。截至 2015 年 4 月,预蜂窝设备仅占 7.5%,因此为了保持逻辑更简单,您可能希望以 API 15+ 为目标并忽略较旧的行为。或者只是在
onPause()中完成所有操作,然后收工。 -
fadden,这条评论根本没有帮助
-
感谢您澄清您实际上对蜂窝前的行为并不感兴趣。
-
我讨厌这个问题,原因是我在近 7 到 10 次安卓面试中看到这个问题是一个多项选择题,令人惊讶的是 MCQ 包含
a) onStop() b) onPause() c) onDestroy() d) onActivityKill()options。答案应该是什么?
标签: android android-activity android-lifecycle android-database