小编典典

活动堆栈问题

java

我有两组活动,假设每组3个活动,(A1,B1,C1 || A2,B2,C2)我从A1启动我的App,然后-> B1-> C1在这里我想从C1跳到->
A2在A2处,如果我按回去,它应该存在该应用程序,而不是退回给C1,然后从A2导航到-> B2-> C2。

因此,基本上我想更改启动的Activity,就像我在一个App中有两个App,而当我切换到第二个App时,我必须清除Activity
Stack。那可能吗?有任何想法吗?


阅读 220

收藏
2020-11-26

共1个答案

小编典典

在我看来,您已经回答了自己的问题。你写了:

因此,基本上我想更改启动的Activity,就像我在一个App中有两个App,而当我切换到第二个App时,我必须清除Activity Stack。

我会这样:

创建一个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根据此意图重新开始。

在中DispatcherActivityonCreate()您需要根据意图中的额外内容来确定要做什么,如下所示:

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

注意:我只是输入此代码,所以我还没有编译它,所以它可能不是完美的。你的旅费可能会改变 ;-)

2020-11-26