【问题标题】:FLAG_ACTIVITY_REORDER_TO_TOP causing RuntimeException or black screen on rotationFLAG_ACTIVITY_REORDER_TO_TOP 导致 RuntimeException 或旋转时黑屏
【发布时间】:2015-04-19 18:24:09
【问题描述】:

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

这很好用,但以下情况除外:

  1. 强制关闭后重新启动应用程序
  2. 点击按钮进入活动 2
  3. 点击按钮返回活动 1
  4. 旋转屏幕。

此时,应用程序崩溃并显示“执行停止未恢复的活动”。 Lollipop 只是显示黑屏。

奇怪的是,如果您在第 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);
    }

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

有什么想法吗?

【问题讨论】:

    标签: android android-intent android-activity


    【解决方案1】:

    有趣的案例,如果您调试生命周期方法,您可以看到,当您旋转屏幕时,正在调用 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);
    

    相反(但是,它的工作方式略有不同 - 它清除调用活动顶部的堆栈,而不是对其重新排序,因此您至少需要重新创建 1 次活动)。

    另一种选择是在清单中的活动定义中使用launchMode 属性。 launchMode="singleInstance" 可能是您所追求的(但是这会影响您的任务堆栈,因此请谨慎处理)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      相关资源
      最近更新 更多