2010-11-12 89 views
4

可能重複背:
Removing an activity from the history stack操縱活動堆棧中的Android

假設我有我的籌碼三項活動,像這樣的A→B→C。
我想要終止B並將其替換爲活動D,以便堆棧看起來像這樣:A→D→C
預期的效果是具有「屏幕選擇器」活動C.它在acti之上打開vity B提供了許多可供選擇的東西,當用戶點擊一個時,它會關閉,顯示所選的屏幕。我可以使用overridePendingTransition取消開場動畫,但單靠這一點無法幫助我通過關閉選擇器界面來顯示活動。

在Android中有沒有辦法做到這一點?

回答

1

我有兩個真正的開膛手。第一個不完美但很容易實現;第二個應該給出預期的結果,但很難實施。

一種是使用FLAG_ACTIVITY_REORDER_TO_FRONT和FLAG_ACTIVITY_PREVIOUS_IS_TOP開始活動。這將爲任何現有活動提供預期的行爲。如果活動不在堆棧的後面,特別是在第一次啓動時,它仍然不起作用。

另一種可能性 - 我還沒有實現 - 是創建一個非常像TabHost的ActivityManager並將意圖傳遞給這個人。然後它負責在其onNewIntent()方法中加載下一個活動。這應該起作用並且允許單獨開發單獨的活動。

2

您可以用FLAG_ACTIVITY_NO_HISTORY標誌啓動B。所以它不會進入堆棧,C將決定啓動D或B.它是否符合您的需求?

+0

不,不是因爲兩個原因。第一個,它將阻止用戶使用後退鍵從屏幕選擇器返回。第二個,它不會改變它會在屏幕選擇器的*頂部*上打開新的,這正是我想要避免的。 – Jean 2010-11-12 12:14:34

+0

看,你可以在選擇器的onDestroy()中開始需要的活動。如果在選擇器中沒有更改 - 它啓動B,否則啓動D並自行關閉。所以在返回鍵onDestroy()將被調用,你「返回」B活動。它看起來如何? – ackio 2010-11-13 05:11:47

+0

一般來說,更改堆棧並不是個好主意,它是android用戶的意外行爲。但是如果你仍然想要這個黑客可以幫助。 – ackio 2010-11-13 05:23:14

1

另一個idia))B和D是具有不同佈局的B模式和D模式的相同的活動(!)。當它處於B模式時,它會使用StartActivityForResult()啓動C語言。在返回時,它決定要膨脹哪個佈局。很簡單,對吧?

+0

這確實起作用。但我正在一個非常大的團隊中工作,並且我們開發了十幾種不同的屏幕 - 將它們全部放在同一個活動中是非常不方便的,至少可以說。這就是說,我想不出任何其他體面的方式,因爲選擇器會截取屏幕截圖並將其傳遞給其他所有人,並且需要先用閉幕動畫顯示它,然後...... yuck。無論如何非常感謝,我不認爲它可以做任何其他體面的方式,而不是使它成爲一個單一的活動與幾種模式。 – Jean 2010-11-15 09:57:47