2011-02-18 391 views
3

考虑一下包含活动A,B,C的应用程序。 A从启动器启动,B从A启动。B有一个按钮。我的要求是单击B上的按钮活动的当前历史堆栈A-> B应该清除,并且历史堆栈只能包含C.是否可以执行?如果是这样,请告诉我...如何清除堆栈历史记录?

在此先感谢!

回答

3

虽然单调乏味,但可以通过使用Activity方法startActivityForResult(),setResult(),finish()和onActivityResult()来启动。

在伪代码:

 
A: startActivityForResult(B) 
B: startActivityForResult(C) 
C: startActivity(D); setResult(CLEAR); finish() 
D: ... 
B: (onActivityResult) setResult(CLEAR); finish() 
A: (onActivityResult) finish() 

如果你愿意改变你的架构有点更“自然”的方式来做到这一点是使用FLAG_ACTIVITY_CLEAR_TOP一种简单的方法,从A,B去,到刚刚A.

第三种方法是设置A,B,和C使用noHistory,但你会失去备份的C伸到B或A.

+1

意图goHome = new Intent(CreateView.this,HomeActivity.class); \t \t \t \t goHome.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \t \t \t \t startActivity(goHome); – 2011-07-01 01:58:11

0

我的“解决方案”的能力是重写活动C中后退按钮的行为,以便它转到电话启动器,而不是返回活动堆栈。这样,活动A和B仍然在后面的堆栈上,但用户无法导航回到它们。所以最终结果与活动C是根活动相同。

/** 
* Override "Back" key on Android 1.6 
* Don't want user going back to Login or Register forms. 
*/ 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     goHome(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
}  

/** 
* Override "Back" key on Android 2.0 and later 
*/ 
@Override 
public void onBackPressed() { 
    goHome(); 
} 

private void goHome() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(startMain);  
}