Android生命周期:在onStart()或onResume()中填写活动中的数据?

时间:2011-01-08 23:36:19

标签: android dialog lifecycle onresume onstart

您是否应该通过光标获取数据并填写屏幕上的数据,例如设置窗口标题,在onStart()onResume()

onStart()似乎是合乎逻辑的地方,因为在onStart()之后,活动已经显示,尽管在​​后台。值得注意的是,我遇到了一个托管对话框的问题,让我重新考虑了这一点。如果用户在对话框仍处于打开状态时旋转屏幕,则onCreateDialog()onPrepareDialog()onStart()onResume()之间被称为。如果对话框需要基于您需要在onResume()之前获取数据的数据。

如果我对onStart()的说法不对,那么为什么记事本示例会在onResume()中做出错误示例?请参阅http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html NoteEditor.java第176行(title = mCursor.getString...)。

此外,如果我的Activity启动另一个Actvity / Dialog,它会更改我的光标所跟踪的数据。即使在最简单的情况下,这是否意味着我必须手动更新我之前的屏幕(主要活动中的对话框的监听器),或者我必须注册ContentObserver,因为我' m不再更新onResume()中的数据(虽然我当然可以更新两次)?

我知道这是一个基本的问题但是最近的对话令我意外,让我意识到这一点。

2 个答案:

答案 0 :(得分:3)

此外,解决方案取决于适合您的方式。

如果您希望每个应用程序预先填充一次光标(并且不关心任何更改,那么您可以在onCreate()中执行此操作。只有在应用程序进程被终止且应用程序重新启动时才会调用此方法。

如果您希望每次可见生命周期开始时都预先填充游标(大多数情况下服务/广播正在调用您的活动,您应该使用onStart()

如果希望为活动的每个前景生命周期预填充游标,则应使用onResume()。因此,如果您有一个对话框或其他子活动修改某些信息,因此您想重新加载光标,最好在onResume()中执行此操作。此方法的缺点是每次活动进入前景时光标都会重新加载。

希望这说清楚

答案 1 :(得分:2)

要回答有关NoteEditor的问题,只需看看您引用的那一行上方的行,您就会看到......

    // Requery in case something changed while paused (such as the title)
    mCursor.requery();

评论似乎解释了这一切。虽然我自己没有通过NotePad示例,但似乎作者正在建立能够在NoteEditor暂停(然后恢复)时从更改中恢复。

正如GSree解释的那样(当我输入这个时),没有正确或错误的答案,它只取决于活动生命周期的哪一点需要做。