我有两组活动,假设每组有 3 个活动,(A1,B1,C1 || A2,B2,C2) 我从 A1 启动我的应用程序然后 -> B1 -> C1 在这里我想从 C1 跳转到 -> A2在A2,如果我按下它应该存在应用程序而不是让我回到C1,然后从A2我导航到-> B2-> C2。
所以基本上我想改变开始的活动,就像我在一个应用程序中有两个应用程序,当我翻转到第二个应用程序时,我必须清除活动堆栈。那可能吗?有任何想法吗?
我有两组活动,假设每组有 3 个活动,(A1,B1,C1 || A2,B2,C2) 我从 A1 启动我的应用程序然后 -> B1 -> C1 在这里我想从 C1 跳转到 -> A2在A2,如果我按下它应该存在应用程序而不是让我回到C1,然后从A2我导航到-> B2-> C2。
所以基本上我想改变开始的活动,就像我在一个应用程序中有两个应用程序,当我翻转到第二个应用程序时,我必须清除活动堆栈。那可能吗?有任何想法吗?
在我看来,您已经回答了自己的问题。你写了:
所以基本上我想改变开始的活动,就像我在一个应用程序中有两个应用程序,当我翻转到第二个应用程序时,我必须清除活动堆栈。
我会这样做:
创建一个DispatcherActivity
在应用程序启动时启动的活动。此活动是您的任务的根活动,负责根据...启动 A1 或 A2 并且不调用finish()
自身(即:它将被 A1 或 A2 覆盖,但仍位于活动堆栈的根部)。
在A1
中,捕获“返回”键并告诉 DispatcherActivity 退出,如下所示:
@Override
public void onBackPressed() {
Intent intent = new Intent(this, DispatcherActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addExtra("exit", "true");
startActivity(intent);
}
这会将任务堆栈清除到根活动 ( DispatcherActivity
),然后DispatcherActivity
以此意图重新开始。
在C1
, 要启动A2
,请执行以下操作:
Intent intent = new Intent(this, DispatcherActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addExtra("A2", "true");
startActivity(intent);
这会将任务堆栈清除到根活动 ( DispatcherActivity
),然后DispatcherActivity
以此意图重新开始。
in DispatcherActivity
, inonCreate()
你需要根据 Intent 中的 extras 来决定要做什么,像这样:
Intent intent = getIntent();
if (intent.hasExtra("exit")) {
// User wants to exit
finish();
} else if (intent.hasExtra("A2")) {
// User wants to launch A2
Intent a2Intent = new Intent(this, A2.class);
startActivity(a2Intent);
} else {
// Default behaviour is to launch A1
Intent a1Intent = new Intent(this, A1.class);
startActivity(a1Intent);
}
在A2
中,捕获“返回”键并告诉 DispatcherActivity 使用与中相同的覆盖onBackPressed()
退出A1
。
注意:我只是输入了这段代码,所以我没有编译它,它可能并不完美。你的旅费可能会改变 ;-)
如果您想在按下后退按钮而不是返回上一个活动时关闭您的应用程序,您应该覆盖后退按钮。在关闭活动后在覆盖方法中调用finish() 方法。我希望这可以帮助你。
编辑:
检查以下链接:这是用于关闭视图堆栈中的所有活动。在关闭您的应用程序之前关闭所有活动。
http://www.coderzheaven.com/2011/08/27/how-to-close-all-activities-in-your-view-stack-in-android/
您可以检查在 Activity A2 中按下按钮的时间,然后如果它是返回按钮,您可以关闭应用程序。您可以在A2中使用以下方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
this.finish();
}
return super.onKeyDown(keyCode, event);
}
尝试以此意图启动活动 A2 -intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
使用 onBackPressed 和 finish 方法处理这个问题。
在启动其他活动之前,最好使用 finish() 方法关闭当前活动。
如果您想在后按时转到上一个活动,请覆盖 onBackPressed 方法并调用特定意图。
在 A2 活动中,在 onBackPressed 方法中添加完成方法(此处不要调用之前的活动)。这是方法之一。
在将 Intent 从 Activity C1 传递到 A2 时用作
Intent intent=new Intent(C1.this,A2.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
并在您的活动 A2 中覆盖后退按钮
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
A2.this.finish();
}
return super.onKeyDown(keyCode, event);
}
FLAG_ACTIVITY_CLEAR_TOP
不是你要找的。我想你正在寻找:
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);