FLAG_ACTIVITY_REORDER_TO_TOP导致RuntimeException或黑屏旋转

时间:2015-02-18 16:41:32

标签: android android-intent android-activity

我有两个活动,我想在它们之间切换而不重新创建或复制它们。每个活动都有一个按钮,该按钮将使用FLAG_ACTIVITY_REORDER_TO_TOP的意图将用户发送给另一个。

除下列条件外,此方法效果很好:

  1. 强制关闭后启动app新鲜
  2. 点击按钮转到活动2
  3. 点击按钮返回活动1
  4. 旋转屏幕。
  5. 此时,应用程序崩溃了"执行停止未恢复的活动"。棒棒糖只是显示黑屏。

    奇怪的是,如果您在步骤4之前进入主屏幕并恢复应用程序然后旋转上述条件没有任何问题,应用程序正常工作,直到关闭/重新启动。

    这种情况似乎特定于FLAG_ACTIVITY_REORDER_TO_TOP,并且在Android 5.0和4.4上发生,并且只是重新开始。

    我对清单中的活动没有任何属性。布局只有一个按钮,可以调用如下所示的方法:

    MainActivity:
    public void goSecond(View v) {
            Intent i = new Intent(this, SecondActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(i);
    }
    
    SecondActivity:
        public void goFirst(View v) {
            Intent i = new Intent(this, MainActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(i);
        }
    

    我没有覆盖任何其他生命周期方法或做任何其他事情。

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

有趣的情况是,如果您调试生命周期方法,您可以看到,在旋转屏幕时,正在调用onStop,之前没有onPause。崩溃然后记录

java.lang.RuntimeException: Performing pause of activity that is not resumed: MainActivity

接着是

java.lang.RuntimeException: Performing stop of activity that is not resumed: MainActivity

我想这是框架中的一个错误。有趣的是,这似乎只发生在标志FLAG_ACTIVITY_REORDER_TO_FRONT

截至写作时,我刚发现这篇文章,清楚地表明这个标志似乎存在一个重大缺陷:Is any alternate of Intent.FLAG_ACTIVITY_REORDER_TO_FRONT(注意提到的Android Bug Ticket)


解决方法: 如果你依赖于FLAG_ACTIVITY_REORDER_TO_FRONT给你的行为,并且你想模仿它(某种程度),你可以使用

i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

相反(但是,它的工作方式稍有不同 - 它会在被调用的活动之上清除堆栈,而不是重新排序它,因此您至少会重新创建一次活动)。

另一种选择是在清单中的活动定义中使用launchMode属性。 launchMode="singleInstance"可能是您之后的事情(但是这会使您的任务堆混乱,因此谨慎处理)

毕竟,如果您的设计允许,请考虑片段以完全避免这些问题。