0

这些天,Android Activity 生命周期让我有点头疼。

我想在应用程序进入后台之前存储最后一个显示的 Activity,以便在用户恢复应用程序时恢复正确的状态。问题在于,为什么应用程序进入后台而不是全部执行相同的操作有多种可能性。

为了清楚起见,假设我有 3 个活动;A-1、A-2 和 A-3(A-2 是 A-3 的入口)。A-2 和 A-3 只是普通的活动,但 A-1 是某种调度程序。它是清单文件中的启动器 Activity,它的唯一功能是读取SharedPreference其他两个在其onPause()方法中设置的基本上指示最后一个 Activity 是什么,并激活该 Activity 然后调用this.finish(). 直线前进。

场景是(在所有这些之后,用户从后台进程列表或启动器重新启动应用程序):

  1. 在 A-3 中,用户点击“返回”按钮并转到主屏幕。这运行onPause(),然后onDestroy()为 A-3。
  2. 在 A-3 中,用户点击“主页”按钮并转到主屏幕。这运行onPause(),然后onSavedInstanceState()为 A-3。
  3. 用户执行上述两项中的任何一项,然后调出后台进程列表并强制终止应用程序。不执行任何代码。
  4. 操作系统检测到它需要释放内存,因此首先(两者中的)它强制终止后台进程,然后如果这还不够,则强制终止当前活动的进程。

现在在每种情况下都会发生以下情况:

  1. A-1 启动,它读取设置的首选项onPause()并按应有的方式启动 A-3。按设计工作(但可能不是最好的方法)。
  2. A-1 启动,并执行与上述相同的操作。
  3. 现在事情变得棘手了。当应用程序重新启动时,没有任何迹象表明它已终止,因此 A-1 会读取首选项,然后在应该启动 A-2 时启动 A-3。这是不受欢迎的,会破坏应用程序
  4. 类似于数字 3。

我的问题是,在这种情况下如何最好地管理应用程序状态

捆绑包是否仅在应用程序运行时才实时传递onSavedInstanceState,那么这是否是仅在“会话”期间保存此类信息的最佳方式

4

1 回答 1

0

如果我正确理解您的需求,那么您可以简单地覆盖 A-3 的 onBackPressed() 以便它修改 SavedPreferences,并且当用户重新启动应用程序时,它将打开 A-3。

在第二种情况下,你不需要保存任何东西,因为应用程序没有关闭,它只是放在后台。当用户重新进入应用程序时,操作系统会自动重新激活上次活动的活动 - A-3。

在案例 3 和 4 中(可能在案例 2 中将其置于后台之后),如果应用程序被强制终止,那么您将不会修改 SavedPreferences,因为用户没有单击返回。

于 2013-04-19T16:09:03.270 回答