当从堆栈恢复重新创建的活动时,不会调用onStart()方法

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

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

  • 活动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()。 这与活动生命周期文档中所述内容相反。

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


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

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

    对于主题或任何UI组件的更改,您应该在onResume中处理 - 换句话说,当用户返回到Activity时处理UI元素的更改。 这样做的一个选择是通过startActivityForResult传递标志。

    更好的是,使用sharedPreferences (或使用其他方法)使主题选择持久化,然后在恢复Activity时从中读取。 这将确保选择正确的主题,而不管用户如何进入Activity

    编辑:

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

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


    这与文档完全一致。

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

    如果您查看图表,则无论onStart如何,都会在返回活动时调用onResume。


    如果您想更改UI相关组件,则必须使用OnResume方法而不是重新创建所有活动。 如下所示。

        @override
        onResume()
        {
        textview.setText("Change text When activity resumes");
        }
    
    链接地址: http://www.djcxy.com/p/90811.html

    上一篇: Activity onStart() not called when resuming an recreated activity from a stack

    下一篇: How to stopService when App is fired