2011-02-18 386 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);  
}