Android生命周期:在onStart()或onResume()中的活动中填写数据?
您是否应该通过光标获取数据并在屏幕上填写数据,例如在Android生命周期:在onStart()或onResume()中的活动中填写数据?,android,dialog,lifecycle,onresume,onstart,Android,Dialog,Lifecycle,Onresume,Onstart,您是否应该通过光标获取数据并在屏幕上填写数据,例如在onStart()或onResume()中设置窗口标题 onStart()似乎是一个合乎逻辑的地方,因为在onStart()之后,活动可以显示,尽管是在后台。值得注意的是,我遇到了一个管理对话框的问题,这让我重新思考这个问题。如果用户在对话框仍然打开时旋转屏幕,则在onStart()和onResume()之间调用。如果对话框需要以数据为基础,则在onResume()之前需要有数据 如果我对onStart()的看法是正确的,那么为什么记事本示例在
onStart()
或onResume()中设置窗口标题
onStart()
似乎是一个合乎逻辑的地方,因为在onStart()
之后,活动可以显示,尽管是在后台。值得注意的是,我遇到了一个管理对话框的问题,这让我重新思考这个问题。如果用户在对话框仍然打开时旋转屏幕,则在onStart()
和
onResume()之间调用。如果对话框需要以数据为基础,则在onResume()之前需要有数据
如果我对onStart()
的看法是正确的,那么为什么记事本示例在onResume()
中给出了一个不好的示例?请参阅NoteEditor.java第176行(title=mCursor.getString…
)
此外,如果“我的活动”启动另一个活动/对话框来更改光标跟踪的数据,该怎么办。即使在最简单的情况下,这是否意味着我必须手动更新上一个屏幕(主活动中对话框的侦听器),或者我必须注册ContentObserver,因为我不再更新onResume()中的数据(当然可以更新两次)
我知道这是一个基本问题,但令我惊讶的是,最近的对话让我意识到了这一点。同样,解决方案取决于适合你的
如果您希望每个应用程序预填充一次游标(并且不担心任何更改,则可以在onCreate()中执行此操作。只有在终止应用程序进程并重新初始化应用程序时,才会调用此方法
如果希望每次可见生命周期开始时都预填充光标(大多数情况下,服务/广播正在调用您的活动,则应使用onStart()
如果希望为活动的每个前台生命周期预填充光标,则应使用onResume()。因此,如果您有一个对话框或另一个子活动修改某些信息,因此希望重新加载光标,最好在onResume()中执行此操作。此方法的缺点是每次活动进入前台时,都会重新加载光标
希望这能让你明白要回答你关于NoteEditor的问题,只需看看你引用的那一行上面的行,你就会看到
// Requery in case something changed while paused (such as the title)
mCursor.requery();
评论似乎解释了这一切。虽然我自己还没有看过记事本示例,但作者似乎正在增强在记事本编辑器暂停(然后恢复)时从更改中恢复的能力
正如GSree所解释的(当我输入时),没有正确或错误的答案,它只是取决于在活动生命周期的哪个点需要做什么。如果您有一个对话框,a)基于您的数据,b)正在修改该数据,那么您需要a)将光标数据加载到onStart()中,以实现onPrepareDialog(),和,b)在onResume()中重新加载光标数据,因为暂停后数据可能已更改???@pjv根据您的要求,您只需在onResume()方法中加载数据即可。在onResume()中管理对话框生命周期。有关活动(),请参阅文档。在用户可以与活动交互之前,该活动将在Resume上进行。感谢您的评论,但正如我在第二段中所说,wrt。托管对话框:onCreateDialog()和onPrepareDialog()在onResume()之前调用。当有一个完全可用的平台实现时,我不想亲自管理对话框,这只是说他们会在暂停后重新查询。我在问题中也提出了同样的建议。你的意思是?显然,这只是一个坏例子,而不是记事本中的一个bug,因为记事本编辑器与之交互的其他任何东西都不会放大onStart()和onResume()之间的差异。@pjv:我的观点是,在没有onPause()->onResume()->onPause()->onResume()的情况下,onPause()->onResume()等可能会多次出现(或onPause()->onStop()->onDestroy()->onCreate()->onStart())曾经发生过。如果在onPause()->onResume()周期中有可能对任何内容进行关键更改,则在onResume()中而不是在onStart()中“执行”(和“重做”)某些操作绝对有意义.好的,这更清楚了,你是对的,我也会在onResume()中看到“重做”。