2013-01-01 47 views
45

好吧,所以我有點不知所措。所以我有了MainActivity,並且從那裏可以啓動一個Activity到DegreePlanActivity,然後從那裏啓動另一個Activity到EditDegreePlan。我在AndroidManifest中將EditDegreePlan設置爲noHistory。問題在於他們保存了EditDegreePlan後,它啓動了一個Activity到DegreePlan。因此,如果用戶按下後退,他們必須按兩次才能再次進入MainActivity。我想擺脫這一點,所以他們只需要按一次。儘管如此,但我很難過。Android刪除從後面堆棧中的活動

如果我將DegreePlanActivity設置爲noHistory,那麼它們在EditDegreePlan中不能按回到它。

我試着重寫onBackPressed方法並啓動MainActivity的意圖。接下來的問題是,他們必須多次按回來退出應用程序。

我該怎麼辦?

+11

寫完成() –

回答

95

FLAG_ACTIVITY_CLEAR_TOP明確你的活動堆棧,您可以使用代碼:

Intent intent = new Intent(this, Activity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 

記住這個標誌清除只是中級活動,例如,如果你有A,B,C在Back Stack然後從C活性會到D與此標誌明確Back Stack和堆棧將是A,B,C,D但如果你從活動D到活動A與此標誌,B,C,D活動將從堆棧彈出你將在Back Stack中有A。

+0

謝謝!這工作完美。我甚至能夠從AndroidManifest中刪除noHistory。只需將一行代碼添加到EditDegreePlanActivity的保存方法即可解決所有問題。 – Emrys90

+0

如何使用taskAffinity =「」; ? – ralphgabb

+0

哇,這是一個很棒的功能。我無法相信它的工作原理,完全符合我的需求。我有一個掃描條形碼的背景異步服務。在特定的條形碼上開始一些活動。在某些情況下,我需要從堆棧中刪除一些已啓動的活動。這很好用! –

6

看來,如果您根本沒有指定任何標誌,您將會得到所需的行爲。後退按鈕只是做正確的事情。要從代碼中關閉活動,請使用finish()方法,它與用戶按下後退按鈕具有相同的效果。因此,當您完成EditDegreePlan時,您將自動到達DegreePlan,無需調用任何Intents

5

這裏是你的流程:

MainActivity - > DegreePlanActivty - > EditDegreePlan - > DegreePlan - > MainActivty

覆蓋這些裏面你的 「DegreePlan」

public void onBackPressed() { 
    super.onBackPressed(); 
    Intent goToMainActivity = new Intent(getApplicationContext(), MainActivity.class); 
    goToMainActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // Will clear out your activity history stack till now 
    startActivity(goToMainActivity); 
} 
7

我的方法建議您在啓動EditDegreePlan-Activity時使用startActivityForResult(),而不是簡單地使用startActivity(),如Android tutorials中所述。

在EditDegreePlan效你再打電話

setResult(RESULT_OK); 
finish(); 

如果你不期望從EditDegreePlan-活動的任何數據,那麼你不一定必須實現onActivityResult

+0

令人難以置信的想法!我的用例:一個簡單的登錄活動(這可能導致註冊活動,與用戶流無縫),完成登錄後,打開一個功能活動。如果用戶回擊,它應該顯示我的第一個活動(觸發登錄的活動)。解決方案:現在使用'startActivityForResult'調用登錄和註冊活動。當他們完成後,他們就沒有了。謝謝! – danguilherme

6

簡單的解決方案API> = 15到API 23 用戶活動名稱的意圖。

Intent nextScreen = new Intent(currentActivity.this, MainActivity.class); 
nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(nextScreen); 
ActivityCompat.finishAffinity(currentActivity.this); 
+0

太棒了! thnx爲目前的事情。 – CelticParser

2

使用該清除棧:startActivity方法之後

menuIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);