从堆栈恢复重新创建的活动时未调用活动 onStart()

3 android android-lifecycle android-activity

长话短说:我目前正在开发一款小型安卓游戏。一项功能是能够更改应用程序主题。当用户更改主题时,会在整个应用程序中广播一个事件,并且所有活动活动都会调用 recreate() 来应用新主题。

问题: 假设有一堆活动:A、B、C。所有活动都将按照打开的顺序接收事件并调用 recreate()。这些是将被调用的生命周期事件(按顺序):

  • Activity A 将调用 onDestroy()、onCreate()、onStart()、onResume() 和 onPause()
  • Activity B 将调用 onDestroy()、onCreate()、onStart()、onResume() 和 onPause()
  • Activity C 将调用 onPause()、onStop()、onDestroy()、onCreate()、onStart()、onResume()。

请注意,活动 A 或 B 都没有调用 onStop()。当这些活动返回时(例如按下后退按钮),它们变得可见时不会调用 onStart(),但会调用 onResume() 。这与活动生命周期文档中的规定相反。

问题:我在这里做错了什么吗?是否有另一种方法可以重新启动应用程序中的所有活动而不扰乱活动生命周期?

Jim*_*Jim 5

我认为你在这里采取了错误的方法。您不应该使用框架调用来更改主题。您遇到的问题是您没有onStop像框架那样调用,但即便如此......

您的方法不正确的主要原因是 Android 可能已经销毁了它(Activity如果它不可见)。因此,此时向其发送调用框架方法的事件不仅是不必要的,而且可能会导致不可预测的状态和行为。甚至可能导致崩溃。

对于主题或任何 UI 组件的更改,您应该在中处理onResume- 换句话说,当用户返回到Activity. 执行此操作的一种选择是通过 传递标志startActivityForResult

更好的是,使用(或使用其他方法)保留您的主题选择sharedPreferences,然后在Activity恢复时从中读取。这将确保选择正确的主题,无论用户如何访问Activity.

编辑:

请注意,Activity框架方法并不是public因为它们应该随时被其他类访问,而是因为它们需要在您的应用程序中实现。它们不打算在框架之外调用。

您应该注意,在官方文档中,Activity您调用的任何方法都没有被列为“公共方法”(http://developer.android.com/reference/android/app/Activity.html#Activity())。您正在以不受支持的方式使用它们。然而,我指出这一点只是为了让您意识到这一点,并且这并不是解决此问题的普遍接受的方法。