不要破坏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活动并且不应该在历史中的主要内容,如果未能解决你的问题,请参考以下文章