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

7
你是否应该通过光标获取数据并在屏幕上填充数据,例如设置窗口标题,在onStart()onResume()中?
从逻辑上讲,onStart()似乎是合适的位置,因为在onStart()之后Activity可以被显示,尽管是在后台。值得注意的是,我曾经遇到过一个管理对话框的问题,这使我重新考虑了这个问题。如果用户在对话框仍然打开的情况下旋转屏幕,则onCreateDialog()onPrepareDialog()onStart()onResume()之间调用。如果对话框需要基于数据,则需要在onResume()之前获取数据。
如果我对onStart()的理解正确,那么为什么Notepad示例onResume()中进行操作会给出错误示例?请参见http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html NoteEditor.java 第176行(title = mCursor.getString...)。
另外,如果我的Activity启动另一个Activity/Dialog来更改光标跟踪的数据,那怎么办?即使是在最简单的情况下,这是否意味着我必须手动更新我的前一个屏幕(主Activity中对话框的监听器),或者我必须注册一个ContentObserver,因为我不再在onResume()中更新数据(当然我也可以更新两次)?
我知道这是一个基本的问题,但是最近的对话框让我惊讶地意识到了这一点。
2个回答

3

再次强调,解决方案的选择取决于适合你的情况。

如果你只希望光标在应用程序每次启动时都是预填充的(不考虑任何更改),那么可以在onCreate()方法中实现。只有在应用进程被杀死并重新启动时,该方法才会被再次调用。

如果你希望在可见生命周期开始时每次预填充光标(大多数情况下,服务/广播正在调用你的活动),则应使用onStart()方法。

如果你希望在每个活动前台生命周期中都预填充光标,则应使用onResume()方法。因此,如果你有一个对话框或另一个子活动修改了一些信息,因此你希望重新加载光标,则最好在onResume()中这样做。这种方法的缺点是每次活动进入前台,光标都会重新加载。

希望这能使问题更加清晰明了。


如果您有一个基于数据并且正在修改该数据的对话框,那么您需要在onStart()中加载光标数据以供onPrepareDialog()使用,并在onResume()中重新加载光标数据,因为数据在暂停后可能已更改。 - pjv
根据您的要求,您可以在onResume()方法中简单地加载数据。在onResume()中管理对话框生命周期。请参阅活动文档(http://developer.android.com/guide/topics/fundamentals.html#actlife)。在用户与之交互之前,活动将通过onResume()进行处理。 - GSree
谢谢您的评论,但正如我在第二段关于托管对话框中所说的那样:onCreateDialog()和onPrepareDialog()在onResume()之前被调用。当有一个完全可用的平台实现时,我宁愿不要自己管理对话框。 - pjv

2
回答关于NoteEditor的问题,只需看一下您引用的那行上面的内容,您就会看到...
    // Requery in case something changed while paused (such as the title)
    mCursor.requery();

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

正如GSree所解释的那样(当我打字时),并没有对错之分,一切取决于Activity生命周期的哪个阶段需要做什么。


这只是说他们在暂停后重新查询。我在我的问题中也提出了同样的建议。你的观点是什么?显然,这只是一个糟糕的例子,而不是Notepad中的错误,因为NoteEditor与onStart()和onResume()之间的差异没有任何其他交互放大。 - pjv
@pjv:我的观点是,onPause() -> onResume() -> onPause() -> onResume()等等可能会发生多次,而不会发生onPause() -> onStop() -> onRestart() -> onStart()(或者onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart())。如果在onPause() -> onResume()周期中有任何关键更改的可能性,则在onStart()中“做”(和“重新做”)某些事情比在onResume()中更合理。 - Squonk
好的,这更清晰了,你是对的,我也会在onResume()中考虑“重做”。 - pjv

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