onSaveInstanceState()和onPause()

时间:2011-03-02 10:35:17

标签: android

我对Android中的这两种方法有点困惑。

从文档中我了解到应该调用onSaveInstanceState()来仅存储临时信息,并且onPause()应该用于存储任何持久数据。

我想知道为什么每次调用onSaveInstance()时都会调用onPause()。然后我读了记事本教程:

  

“请注意,saveState()必须是   同时在onSaveInstanceState()中调用   和onPause()以确保   数据已保存。这是因为那里   不能保证   onSaveInstanceState()将被调用   因为当它被调用时,它就是   在onPause()之前调用。“

无法保证将onSaveInstanceState()被调用,因为您可以使用后退按钮简单地走出活动。

但是根据这个,如果你不在两个方法中保存持久数据,那么应用程序可能会在onSaveInstanceState()内被杀死。

所以我们需要实际保存两种方法中的持久数据,对不对?

但是,如果这是真的,这不是太多的开销,也许应该有一些其他额外的标志来判断方法是否已被调用或什么?

http://developer.android.com/resources/tutorials/notepad/notepad-ex3.html

3 个答案:

答案 0 :(得分:19)

来自activities的开发者指南:

  

注意:因为无法保证调用 onSaveInstanceState(),   您应该仅使用它来记录活动的瞬态   (UI的状态) - 你永远不应该用它来存储持久性   数据。相反,您应该使用 onPause()来存储持久数据(例如   当用户离开时,作为应保存到数据库的数据   活性。

答案 1 :(得分:11)

onSaveInstanceState()旨在“记住”配置发生变化时的当前状态,例如屏幕方向改变。这不是“长期持久性”的意思。

在记事本示例中,这两种情况可能相同。在其他应用中,例如,一个Twitter客户端,数据本身可能会持久保存在后台服务中。在onCreate()中,某些项目会从数据库中提取并显示,例如记住当前的位置。当方向发生变化时,在使用方向更改后,可以在onSaveInstanceState()onCreate()中记住此“当前位置”,以显示用户上次查看的消息。

另见this guide

答案 2 :(得分:4)

您可以使用捆绑包和硬杀死(我们处于焦点时的后退按钮)在onSaveInstanceState中的软杀死(方向更改)上保存非视图实例状态(“内部状态,例如用户首选项”) )在onStop中使用偏好。如果您有其他数据(“共享文档类数据 - 通常使用内容提供程序存储在SQLite数据库中”),则应在onPause中执行此操作。