Android完成以前的导航活动

时间:2012-03-14 15:35:07

标签: android android-activity

我有5项活动(比方说A,B,C,DE)。 活动A到D用于设置一些数据,因此用户可以来回更改任何内容。 另一方面,活动E是摘要,因此不再允许用户返回。

我的想法是在用户到达E

时完成之前的所有活动

目前,我的AD的活动没有附加标记。

Activty E的调用方式如下:

Intent I = new Intent(this, SomeClass.class);

I.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

startActivity(I);

我到处都读过这些标志应该实现我想要做的事情,但是当用户进入活动E并按下Back按钮时,它们没有,应用程序返回活动D

有什么想法吗?我错过了什么?这不是解决这个问题的正确方法吗?

感谢您的帮助

5 个答案:

答案 0 :(得分:7)

在每个活动A,B,C,D中使用方法startActivityForResult而不是startActivity。当用户退出活动E时,处理后退按钮并在intent中设置结果代码。现在在每个A,B,C和D类的onActivityResult方法中处理它,关闭活动并将结果传递给之前的活动。

您也可以在用户完成活动D后立即执行此操作。当用户从D转到E时,您可以使用上述方法实际上一直向下到活动A,然后打开活动E并完成活动A.

上述两种情况都会从用户角度产生相同的结果,除非您在这些活动的onStart方法中做了一些长时间的工作,否则他们看不到中间活动A,B,C,D。

答案 1 :(得分:5)

以防有人需要@achie建议的代码,这里是:

A,B,C,D活动应该开始以下活动:

Intent myIntent = new Intent(this, B.class); // Or C/D
startActivityForResult(myIntent, 1);

此外,A,B,C,D活动应覆盖:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
   if (resultCode == RESULT_OK && requestCode == 1) {
      setResult(RESULT_OK);
      finish();
   }
}

然后E活动应该处理后退按钮:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
      setResult(RESULT_OK);
   }
   return super.onKeyDown(keyCode, event);
}

答案 2 :(得分:3)

我想你正试图写一些巫师:)

要使用FLAG_ACTIVITY_CLEAR_TOP标志,您必须在当前活动任务中拥有活动E.

实施例:E-> A-> B-> C-> D->如果D将使用CLEAR_TOP启动E,那么堆栈中只有活动E.

<强> FLAG_ACTIVITY_CLEAR_TOP 使用标志CLEAR_TOP来启动活动 如果堆栈中已存在被调用活动类型的实例,则此实例将被带到前台,而不是创建新实例。此外,堆栈中驻留在该实例之上的所有活动都将从堆栈中清除。例如,假设当前活动堆栈是ABCDE,启动类型C的活动将清除任务中的活动D和E,并导致堆栈ABC。

FLAG_ACTIVITY_SINGLE_TOP(与您的方案无关) 如果目标活动的实例已经位于堆栈的顶部,则不会创建新实例。

答案 3 :(得分:0)

您需要覆盖Activit E 中的onKeyDown()方法,并拦截KEYCODE_BACK的按键事件(返回键),只需return true即可表示您已处理 Back 事件。现在,将不允许用户导航回上一个活动。

答案 4 :(得分:0)

启动活动E时,请使用以下代码:

Intent I = new Intent(this, SomeClass.class);
I.putExtra("finish_all", true);
I.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(I);