在等待 onActivityResult() 时执行 onDestroy()

18

我有一个包含两个活动(Activity)的应用程序:“A”和“B”。

在“A”中,使用startActivityForResult()启动“B”即等待“B”。 现在,假设“B”在前台。 Android系统是否可以销毁活动“A”而不销毁“B”?(如果是,则在“B”完成后,例如用户输入之后,Android系统必须重新创建并将活动“A”置于前台,并且我需要记住并恢复“A”的早期UI状态。)

请注意,我不是在谈论进程的杀掉(这是另一种情况:如果进程被杀死,则所有活动都将被销毁,并且onDestroy()不会被调用或无法保证调用)。 这个问题只是关于在等待子活动的结果时是否可能发生onDestroy()。

1个回答

19

如果Activity A在B结束时被杀死,你可以保证:

  1. A将会被重新创建。
  2. A将会传递结果。

换句话说,下一次用户访问/需要A时,A将会被重新创建,并在此时将传递任何未完成的结果(从B到A)。

此外,请注意这就是为什么必须通过具有整数请求代码的单个Activity回调返回结果,而不是任意的回调对象。


谢谢,这正是我所想的,只要 onDestroy 可以发生。所以你说它可能会发生在 "A" 上。然而,在这种情况下,“A” 将重新启动,即我也会得到一个 onCreate()(然后,如文档所述,在 onResume() 之前获得结果),因此我需要恢复“A”的早期 UI 状态,对吗?我的意思是,“B” 在“A”的特定子菜单中启动,因此用户希望当“B”结束时,“A”的 UI 状态与启动“B”时相同。(即,“A”与启动“B”时处于同一子菜单中。)如果是这样,我需要在生成“B”之前_同时_持久化“A”的 UI 状态。 - Thomas Calc
请纠正我是否误解了您的问题,但似乎您正在询问有关Activity生命周期的更一般性问题,与startActivityForResult无关。您可以确保结果将从B传递到A(无论A是否被销毁),但这并不意味着Activity的状态已经被保存。如果onDestroy已被调用,则在其在onRestoreInstanceState(或onResume)中重新创建时可能需要恢复其状态,就像您遇到的任何其他Activity一样。 - Alex Lockwood
希望以下两点能更清晰地表达:
  1. 这与startActivityForResult有关,因为我不能确定它是否设置了额外的约束条件,即使在一般情况下“A”可以被销毁,也许如果它正在等待“B”的结果,情况就不是这样了。(即,在这种情况下,“最糟糕”的情况可能是onStop())。但是,根据您的回答,在这种情况下,“B”的销毁也可能发生。(当然,在不同进程中的活动中,独立销毁是显而易见的,但在我的情况下,它们在同一个应用程序/进程中)。
- Thomas Calc
  1. 我会持久化和恢复我的逻辑状态,但不包括UI状态。我的理念(适用于我的应用程序世界)是,如果应用程序(游戏)是通过onCreate()启动的,则始终从主菜单开始,并且玩家可以从那里恢复游戏。因此,我仅在onStart和onResume发生时恢复UI状态,但在这种情况下,UI状态保存在内存中(与游戏逻辑状态不同,我总是持久化)。但是,启动活动“B”(顺便说一句,它不是游戏玩法)是一个例外,即当“B”结束时,“A” 始终 返回到其在启动“B”时存在的UI状态。
- Thomas Calc
但是根据你的回答,在这种情况下也可以销毁“A”。 - Thomas Calc
@AlexLockwood 如果活动 A 被杀掉了。但如果没有配置更改(应用程序处于纵向模式,我假设用户不会只是出于好玩而更改语言),那么它能被杀死吗?从这个线程中可以看出它不能被杀死。但从一些 crashlytics 报告中可以看到它确实可以被杀死。 - andrei

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