活动堆栈问题

时间:2012-07-11 10:47:10

标签: java android stack android-activity

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

所以基本上我想改变起始活动,就像我在一个应用程序中有两个应用程序,当我转到第二个应用程序时,我必须清除活动堆栈。那可能吗?任何想法?

7 个答案:

答案 0 :(得分:1)

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

  

所以基本上我想改变起始活动,就好了   我在一个应用程序中有两个应用程序,当我转到第二个应用程序时,我必须   清除活动堆栈。

我会这样做:

创建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

DispatcherActivity中,在onCreate()中,您需要根据意图中的额外内容确定要执行的操作,如下所示:

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覆盖退出。

注意:我刚输入此代码,所以我没有编译它,它可能不完美。您的里程可能会有所不同; - )

答案 1 :(得分:0)

如果要在按后退按钮而不是返回上一个活动时关闭应用程序,则应覆盖后退按钮。在overwrite方法中,在关闭活动后调用finish()方法。我希望这对你有帮助。

编辑:

检查以下链接:这是用于关闭视图堆栈中的所有活动。在关闭你的应用程序之前关闭所有活动。

http://www.coderzheaven.com/2011/08/27/how-to-close-all-activities-in-your-view-stack-in-android/

答案 2 :(得分:0)

您可以检查在活动A2中按下按钮的时间,然后检查其后退按钮是否可以关闭应用程序。您可以在A2

中使用以下方法
@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            this.finish();
        }
        return super.onKeyDown(keyCode, event);
    }

答案 3 :(得分:0)

尝试使用此意图启动活动A2 - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

答案 4 :(得分:0)

使用onBackPressed处理此方法并完成方法。

在启动其他活动之前,最好使用finish()方法关闭当前活动。

如果您想在后退时转到上一个活动,请覆盖onBackPressed方法并调用特定意图。

在A2活动中,在onBackPressed方法中添加finish方法(不要在此处调用以前的活动)。这是其中一种方式。

答案 5 :(得分:0)

将Intent从活动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);
}

答案 6 :(得分:0)

FLAG_ACTIVITY_CLEAR_TOP不是您想要的。 我想你正在寻找:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);