Long story short: 我目前正在开发一款小型安卓游戏 . 一个功能是能够更改应用程序主题 . 当用户更改主题时,将在整个应用程序中广播事件,并且所有活动活动都会调用recreate()来应用新主题 .
The problem: 假设有一堆活动:A,B,C . 所有活动都将按照打开的顺序接收事件并调用recreate() . 这些是将被调用的生命周期事件(按顺序):
-
活动A将调用onDestroy(),onCreate(),onStart(),onResume()和onPause()
-
活动B将调用onDestroy(),onCreate(),onStart(),onResume()和onPause()
-
活动C将调用onPause(),onStop(),onDestroy(),onCreate(),onStart(),onResume() .
请注意,活动A或B都没有调用onStop() . When those activities are being returned to (eg. back button press), they will not call onStart() when they become visible ,但会调用onResume() . 这与活动生命周期文档中所述的内容相反 .
The question: 我有什么问题吗?是否有另一种方法可以重新启动应用程序中的所有活动而不会破坏活动生命周期?
4 回答
上面的同事回应得很好 . 您报告的行为 . 不会调用onstart和onResume . 我看到它发生在Hot Code Swapping上 . 值得停止应用程序并调用重建 .
我认为你在这里采取了错误的做法 . 您不应该使用框架调用来更改主题 . 你遇到的问题是你没有像框架那样调用
onStop
,但即便如此......您的方法不正确的主要原因是,如果不可见,Android可能已经销毁了
Activity
. 因此,向它发送调用框架方法的事件不仅在那时是不必要的,而且可能导致不可预测的状态和行为 . 甚至可能导致崩溃 .对于主题或任何UI组件的更改,您应该在
onResume
中处理 - 换句话说,当用户返回Activity
时处理对UI元素的更改 . 执行此操作的一个选项是通过startActivityForResult
传递标记 .更好,使用
sharedPreferences
(或使用其他方法)使主题选择保持不变,然后在Activity
恢复时从中读取 . 这将确保选择正确的主题,无论用户如何到达Activity
.编辑:
请注意,
Activity
框架方法不是因为它们应该在任何时间或其他类访问,而是因为它们需要在您的应用程序中实现 . 它们不打算在框架之外调用 .您应该注意,在
Activity
的官方文档中,您调用的所有方法都没有列为"Public Methods"(http://developer.android.com/reference/android/app/Activity.html#Activity()) . 您正在以不受支持的方式使用它们 . 但是,我只是指出这一点,让你意识到这一点,并不是解决这个问题的普遍接受的方法 .这与文档完全一致 .
http://developer.android.com/training/basics/activity-lifecycle/starting.html
如果你查看图表,onResume会在返回活动时被调用,无论是什么,而onStart都没有 .
如果要更改UI相关组件,则必须使用OnResume方法而不是重新创建所有活动 . 喜欢以下