2012-03-14 104 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