Java 活动堆栈问题
我有两组活动假设每组3个活动,(A1,B1,C1 | A2,B2,C2)我从A1开始我的应用程序,然后->B1->C1这里我想从C1跳到->A2,在A2如果我按back,它应该存在应用程序,而不是将我放回C1,然后从A2导航到->B2->C2Java 活动堆栈问题,java,android,stack,android-activity,Java,Android,Stack,Android Activity,我有两组活动假设每组3个活动,(A1,B1,C1 | A2,B2,C2)我从A1开始我的应用程序,然后->B1->C1这里我想从C1跳到->A2,在A2如果我按back,它应该存在应用程序,而不是将我放回C1,然后从A2导航到->B2->C2 所以基本上我想改变开始的活动,就像我在一个应用中有两个应用,当我切换到第二个应用时,我必须清除活动堆栈。可能吗?有什么想法吗?如果你想在按下后退按钮而不是返回上一个活动时关闭你的应用程序,你应该覆盖后退按钮。在覆盖方法中,在关闭活动后调用finish()方
所以基本上我想改变开始的活动,就像我在一个应用中有两个应用,当我切换到第二个应用时,我必须清除活动堆栈。可能吗?有什么想法吗?如果你想在按下后退按钮而不是返回上一个活动时关闭你的应用程序,你应该覆盖后退按钮。在覆盖方法中,在关闭活动后调用finish()方法。我希望这能对你有所帮助 编辑: 检查以下链接:这用于关闭视图堆栈中的所有活动。关闭应用程序之前,请关闭所有活动
您可以检查活动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\u activity\u CLEAR\u TOP)代码>使用onBackPressed和finish方法处理此问题
在启动其他活动之前,最好使用finish()方法关闭当前活动
如果您想在Backpress上转到上一个活动,请重写OnBackpress方法并调用特定的意图
在A2活动中,在onBackPressed方法中添加finish方法(此处不调用上一个活动)。这是一种方式 将意图从活动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);
}
在我看来,你已经回答了你自己的问题。你写道:
所以基本上我想改变开始的动作,就像
我在一个应用程序中有两个应用程序,当我切换到第二个应用程序时,我必须
清除活动堆栈
我会这样做:
创建一个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);
}
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);
}
这将清除任务堆栈直至根活动(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
)
在DispatcherActivity
中,在onCreate()
中,您需要根据意图中的额外内容确定要执行的操作,如下所示:
@Override
public void onBackPressed() {
Intent intent = new Intent(this, DispatcherActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addExtra("exit", "true");
startActivity(intent);
}
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
中,按住“后退”键,并使用与A1
中相同的onBackPressed()
覆盖,通知DispatcherActivity退出
注意:我只是输入了这段代码,所以我没有编译它,它可能并不完美。您的里程数可能会有所不同;-) FLAG\u ACTIVITY\u CLEAR\u TOP
不是您想要的。
我认为您正在寻找:
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
这不管用。要使其工作,A2必须已经在活动堆栈中(在根目录下),而事实并非如此。是的,您可能是对的。必须再次检查文档。这不起作用。要使其工作,A2必须已经在活动堆栈(根)中,但它不是。这不起作用。在A2中调用finish()
不会关闭应用程序,它只会完成A2,然后返回任务中的上一个活动(即C1)@DavidWasser您可以关闭onKeyDown()方法中的所有活动,从而关闭应用程序。这是不对的。使用noHistory
将阻止用户从A1->B1->C1和A2->B2->C2正常导航。错误的方法。+1对于你的努力,需要时间来检查它,但是如果我在到达C1之前决定在B1跳到A2,这也有效吗?是的,当然。在B1,您只需将意图发送给DispatcherActivity,并告诉它启动“A2”。这就是为什么你应该这样做。它是非常灵活的,你不需要太多额外的代码。如果我有一个应用程序的启动屏幕,它必须在一开始显示一次,我如何实现这一点?因为我在去DispatcherActivity之前必须先去SplashActivity?还是有其他解决办法?谢谢,没问题。启动屏幕是您启动的第一个活动(即:清单中有action.MAIN
和category.LAUNCHER
)。它执行它需要执行的操作,然后启动DispatcherActivity
并对自身调用finish()
。现在只有DispatcherActivity
在活动堆栈中。其余的工作正如我所描述的。