【问题标题】:Android lifecycle: Fill in data in activity in onStart() or onResume()?Android生命周期:在onStart()或onResume()中填写活动数据?
【发布时间】:2011-01-08 23:36:19
【问题描述】:

是否应该通过光标获取数据并在屏幕上填写数据,比如设置窗口标题,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 启动另一个 Activity/Dialog 来更改我的光标正在跟踪的数据怎么办。即使在最简单的情况下,这是否意味着我必须手动更新我以前的屏幕(主要活动中对话框的侦听器),或者我必须注册一个 ContentObserver,因为我' m 不再更新 onResume() 中的数据(当然我可以更新两次)?

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

【问题讨论】:

    标签: android dialog lifecycle onresume onstart


    【解决方案1】:

    同样,解决方案取决于适合您的方式。

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

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

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

    希望这说明清楚

    【讨论】:

    • 如果您有一个对话框,a) 基于您的数据,并且 b) 正在修改该数据,那么您需要 a) 在 onStart() 中加载光标数据以用于 onPrepareDialog( ), AND, b) 在onResume()中重新加载游标数据,因为暂停后数据可能发生了变化??
    • @pjv 根据您的要求,您可以简单地在 onResume() 方法中加载数据。在 onResume() 中管理对话生命周期。查看活动文档 (developer.android.com/guide/topics/fundamentals.html#actlife)。该活动将在用户与之交互之前通过 onResume。
    • 感谢您的评论,但正如我在第二段中所说的那样。托管对话框:onCreateDialog() 和 onPrepareDialog() 在 onResume() 之前调用。当有一个完全可用的平台实现时,我不希望自己管理对话框。
    【解决方案2】:

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

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

    评论似乎说明了一切。虽然我自己没有经历过记事本示例,但似乎作者正在建立在 NoteEditor 暂停(然后恢复)时从更改中恢复的能力。

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

    【讨论】:

    • 这只是说他们在暂停后重新查询。我在我的问题中提出了同样的建议。你的意思是?显然,这只是一个糟糕的例子,而不是记事本中的错误,因为 NoteEditor 与之交互的任何其他内容都不会放大 onStart() 和 onResume() 之间的差异。
    • @pjv:我的意思是 onPause() -> onResume() -> onPause() -> onResume() 等在没有 onPause() -> onStop() -> 的情况下会发生多次onRestart() -> on Start() (或 onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart()) 曾经发生过。如果在 onPause() -> onResume() 循环期间有可能对任何事情进行重大更改,那么在 onResume() 而不是 onStart() 中“做”(和“重做”)某些事情是绝对有意义的。
    • 好吧,这更清楚了,你是对的,我也会在 onResume() 中查看“重做”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2011-12-18
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2014-09-26
    • 2020-11-21
    相关资源
    最近更新 更多