不要破坏android活动并且不应该在历史中

Posted

技术标签:

【中文标题】不要破坏android活动并且不应该在历史中【英文标题】:Do not destroy android activity and should not be in the history 【发布时间】:2018-01-26 08:40:59 【问题描述】:

我对 android 和 Activity 的转换有疑问。 我想要的是以下内容:

    MainActivity 调用 Activity B。 Activity B 调用 MainActivity(例如,通过 Back Button,同一个实例) MainActivity 调用 Activity B 的同一个实例。(同一个实例很重要,因为 Activity B 需要很长时间才能启动) Activity B 调用 MainActivity(例如,通过 Back Button,同一个实例) MainActivity 后退按钮被按下,应用程序被终止。

我尝试了什么:

主要活动:

android: launch mode = "single task"

开始活动 B:

Intent intent = new Intent (this, B.class);
this.startActivity (intent);

活动 B:

android: launch mode = "SingleInstance"

启动 MainActivity:

Intent callerIntent = new Intent (this, MainActivity.class);
CallerIntent.addFlags (Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
start activity (caller intent);

很遗憾,第 5 点不起作用。

我找了很久,可惜什么也没找到或者搜了瓶字。我希望有人可以帮助我。

我还有一个小型演示应用程序,您可以在其上测试行为: AndroidStudioZipFile(30 天可用)

【问题讨论】:

【参考方案1】:

不要为此使用特殊的启动模式!

MainActivity 应该像这样调用ActivityB

Intent intent = new Intent(this. ActivityB.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);

ActivityB 应该像这样调用MainActivity

Intent intent = new Intent(this. MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);

这将允许您在 2 个活动之间来回切换,而无需创建任何新实例。您需要在一项或两项活动中覆盖 onBackPressed()

如果您希望MainActivity 中的 BACK 按钮退出应用程序,您需要有点棘手。一个简单的方法如下:

像这样在MainActivity 中声明一个静态变量:

public static boolean exit = false;

MainActivity.onBackPressed() 中,执行以下操作:

exit = true;
super.onBackPressed();

这将导致MainActivity 完成。如果MainActivity 是唯一活跃的Activity,那么你就完成了。但是,ActivityB 可能位于MainActivity 之下。要强制ActivityB 在这种情况下完成,请将其添加到ActivityB.onResume()

super.onResume();
if (MainActivity.exit) 
    finish();
    return;

// Rest of onResume() code goes here...

【讨论】:

嗨大卫谢谢你的解决方案。 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 完美运行,但退出布尔标志不起作用。问题是,当我完成 MainActivity 并再次重新打开它时,Activity B 开始。我为此找到了更好的解决方案。我调用finishAffinity() onBackPressed() 而不调用超级方法。这也关闭了ActivityB。 使用finishAffinity() 有效,但仅适用于 API 级别 16。如果您想支持旧设备,则需要另一种机制。我看不出为什么ActivityB 应该在您重新打开应用程序时启动。您是否通过启动 ActivityB 来启动您的应用程序?? 无论如何,很高兴你有一个可行的解决方案! 应用安卓兼容性为4.1及以上,没问题。我不确定,但我认为是因为最后一个打开的活动是活动 B,而 Android 又回到了这个活动?我用上面的例子测试了它,所以不,我开始主要活动。当我关闭应用程序(打开“最近”并将其删除)时,它适用于您的解决方案,但是当我从“最近”打开应用程序时,我需要 finishAffinity。 仍然没有任何意义。当您从最近打开应用程序时,如果没有活动的活动,它应该使用您的启动器活动打开应用程序,而不是使用上次访问的活动。你能发布你的清单吗?【参考方案2】:

第 5 步中的行为是什么? 我认为,它会在第 5 步之后显示 Activity B,它仍然在后台堆栈中,因为它从未被销毁或完成! 如果您不想在 MainActivity 的后按时保存任何内容,您可以致电

@Override
public void onBackPressed() 
    this.finish();
    System.exit(0);

或者您也可以尝试在 MainActivity 上按下返回时清除返回堆栈! 希望这会有所帮助。

【讨论】:

第 5 步的行为是,Activity 再次被调用。在 MainActivity (ReactNativePart) 中运行一个 WebView,您可以在其中浏览回上次访问的网站。所以整个故事是,我可以在 webview(使用 react native 创建)中浏览,并且在某些站点上,我可以启动本地活动。我必须检查是否可以在 react native 中覆盖此方法。 webview 中现有的返回功能仍然需要使用。 这个解决方案不能如我所愿。我有一个解决方案,我将其称为 onBackPressed 的主屏幕,它可以工作,但它不是那么漂亮。

以上是关于不要破坏android活动并且不应该在历史中的主要内容,如果未能解决你的问题,请参考以下文章

清除 android 活动堆栈开始一个新活动

Android:启动第二个活动时保存历史记录

Android:将数据保存到服务器以避免活动破坏

Android:在通知时不会自动显示使用啥意图标志这样未破坏的活动

当通过意图从相机应用程序返回时,Android 活动被破坏

在 onStop() 之后,带有线程的 Android 活动被破坏