Android:何时使用onStart(),onStop()?

23

我读过几篇文章介绍了onStart()onResume()之间的区别:当活动变为可见状态时,会调用onStart(),当活动准备好接受用户交互时,会调用onResume()。很好。

我总是将代码添加到onPause()onResume()中,从未关注onStart()onStop()

有人能否给出一些具体的例子,说明何时使用onStart()onResume()?同样适用于onStop()onPause()onStop()有什么用处?我可能缺少一些基本的东西。

3个回答

15

onStop() 方法将在您离开 Activity 前往其他 Activity 时被调用(例如,查看 commonswares 在有关对话框主题 Activity 的评论)。 例如,如果您在 Activity A 中使用 startActivity() 启动 Activity B。当你在 Activity B 按返回键时,你会返回到 Activity A 并调用 onStart

这与某些情况下可能调用 onPause 而不调用 onStop 不同。例如,如果屏幕超时或者按下待机按钮,onPause 将被调用,但可能不会调用 onStop(取决于可用内存等),因此它是一种“轻量级暂停”。在这种情况下,onStop 可能最终会被调用,但不会立即被调用。

好的,但这有什么用呢?

通常情况下并没有特定的用处,但也可能有。由于您的 Activity 在启动其他 Activity 后将其内存状态保留在堆栈中,因此该堆栈将随着启动的 Activity 数量而增加(堆栈高度)。 这可能会导致某些应用程序使用大量内存。过段时间后,框架将开始在堆栈上杀死某些 Activity,但这是相当粗暴的,并且可能意味着在返回时需要保留许多状态。

因此,onStart/onStop 的一个示例用途是,在离开一个 Activity 前释放一些状态并在返回时重新创建它。 我曾经使用它将列表适配器设置为空值、清空图像缓存等(在非常特定的应用程序中)。如果您想要释放列表适配器中可见视图使用的内存,可以在 onStart 中重新创建列表适配器,然后让视图被 gc 捡起。这将增加 Activity 其余内存状态存活的可能性。

有些资源只能在 Activity 实例处于活动状态且在堆栈的前面时才被认为足够好以保存。由你决定在你的应用程序中什么是最好的,并且 create/start/resume 的细粒度给了你这个选择。


5
当你离开某个活动并进入其他活动时,onStop()将被调用。实际上,当你的活动不再可见时,它会被调用。如果一个对话框主题的活动出现在前台,onStop()不会被调用。 - CommonsWare
好的观点。在这个例子中,调用的活动可能仍然在后台可见(然后回收东西会很糟糕)。我展示了一个发生这种情况的例子,并且展示了如何利用它来减少内存使用,但这是一个好的例外情况。作为一般规则,这仍然是好的。我还没有看到大量对话活动相互调用的情况。 - Sebastian Olsson
哦,毫无疑问,对话主题的活动是不寻常的。 - CommonsWare

1

onStart() 在 onCreate() 结束后运行。这是一个很好的地方,可以放置广播接收器或初始化一些与 UI 相关的状态,在用户返回到此活动时始终显示。

onResume() 在通过按返回按钮回到 Intent 或 Activity 时运行。因此,每次不同的活动进入前景时都会调用 onPause。


0

我认为你的问题在文档中已经很好地解释了:阅读关于活动生命周期的内容。


onStart()onCreate() 结束任务后运行。当您通过按下返回按钮回到您的 IntentActivity 时,onResume() 就会起作用。 - Hamza Waqas
1
@Hamza 那不是真的。每当您的活动从不可见变为可见时,都会调用onStart()方法。 - Jeffrey Blattman
不是啦!我在我的应用程序中使用了onStart()。这是因为我想在加载活动后从Web服务获取数据。请参考Android指南链接进行查看。 - Hamza Waqas
当活动即将对用户可见时调用。如果该活动进入前台,则接下来调用onResume(),如果变为隐藏状态,则调用onStop()。请查看上面的链接。 - Hamza Waqas

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