您是否应该通过光标获取数据并填写屏幕上的数据,例如设置窗口标题,在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()中的数据(虽然我当然可以更新两次)?
我知道这是一个基本的问题但是最近的对话令我意外,让我意识到这一点。
答案 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解释的那样(当我输入这个时),没有正确或错误的答案,它只取决于活动生命周期的哪一点需要做。