从堆栈

时间:2016-05-11 19:16:26

标签: android android-activity android-lifecycle

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

问题: 假设有一堆活动: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()。 当这些活动被返回时(例如按下后退按钮),当它们变得可见时它们不会调用onStart(),但会调用onResume()。这与活动生命周期文档中的内容相反。

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

4 个答案:

答案 0 :(得分:3)

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

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

对于主题或任何UI组件的更改,您应该在onResume中处理 - 换句话说,当用户返回Activity时处理对UI元素的更改。执行此操作的一个选项是通过startActivityForResult传递标记。

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

编辑:

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

您应该注意,在Activity的官方文档中,您呼叫的所有方法都没有列为"公共方法" (http://developer.android.com/reference/android/app/Activity.html#Activity())。您正在以不受支持的方式使用它们。但是,我只是指出这一点,让你意识到这一点,并不是解决这个问题的普遍接受的方法。

答案 1 :(得分:0)

这与文档完全一致。

http://developer.android.com/training/basics/activity-lifecycle/starting.html

如果查看图表,无论什么情况,onStart都不会在返回活动时调用onResume。

答案 2 :(得分:0)

如果要更改与UI相关的组件,则必须使用OnResume方法而不是重新创建所有活动。喜欢以下。

    @override
    onResume()
    {
    textview.setText("Change text When activity resumes");
    }

答案 3 :(得分:0)

以上同事反应良好。 您报告的行为。不会调用onstart和onResume。我已经看到它发生在Hot Code Swapping上。值得停止应用程序并调用重建。