2012-03-14 106 views
5

我有5项活动(比如说A,B,C,DE)。 活动A到D用于设置一些数据,因此用户可以来回更改任何内容。另一方面,活动E是总结,因此用户不再被允许回去。Android完成之前的导航活动

我的想法是完成所有以前的活动,当用户到达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

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

感谢您的帮助

回答

7

使用在每个活动A,B,C,d代替startActivity的方法startActivityForResult。当用户退出Activity E时,处理后台按钮并将结果代码设置为意图。现在在每个A,B,C和D类的onActivityResult方法中处理它,关闭活动并将结果传递给以前的活动。

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

上述两种情况下,从生产角度看用户相同的结果,他们没有看到中间活动A,B,C,d,除非你是在这些活动的OnStart方法做一些长期的工作。

+0

这是一个简单的改变,它的工作,非常感谢你! – 2012-03-14 16:57:43

0

你需要重写Activit ËonKeyDown()方法和拦截为KEYCODE_BACK的按键事件(返回键),并简单地return true,以表明您处理的事件。现在用户将不被允许导航回到先前的活动。

+0

那不行。这实际上造成了一个问题,即用户没有机会再次使用后退按钮,这违背了最佳实践。除非你有充分的理由这么做,否则千万不要阻塞后退按钮。在这种情况下,用户在点击后退按钮时甚至不会退出。 – achie 2012-03-14 15:51:57

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); 
+0

我试过了,但似乎什么也没做。这是一些内置的标志或什么? 我必须以某种方式对待它吗? – 2012-03-14 16:55:05

3

我想your're尝试写一些不大不小的向导:)

。为了使用FLAG_ACTIVITY_CLEAR_TOP标志必须在当前的活动任务已经动鄂。例如: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(在您的情况不相关) 如果目标活动的一个实例是已经在堆栈的顶部,则不会创建新实例。

+0

你的解释帮助我了解了这些标志的真正用途。在我的情况下,在A之前调用E并不可行,但我会在未来的应用程序中记住这一点。 非常感谢! – 2012-03-14 16:54:01

5

万一有人需要的是@achie建议的代码,那就是:

A,B,C,d活动应该像这样开头以下活动:

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

此外, ,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); 
} 
+0

这个工作适合你吗?我需要完全相同的东西,尝试了上面的代码,但是我的最后一个活动继续回到先前的活动。 – 2013-03-22 21:24:09

+0

是的,这是为我工作。 A导航到B,导航到C,导航到D,导航到E,然后再按回去,因为所有活动都已完成,因此您转到主屏幕。 我已经为你上传了一个Android项目样本:https://anonfiles.com/file/e9a7c889a7b2f358f29c868b7fa1d755 – fernandospr 2013-06-25 18:32:15

+0

感谢您花时间发布它,但我已经设法让它工作。 – 2013-06-25 20:38:04