2010-11-16 82 views
52

我有一個應用程序與Android中的幾個活動,我希望用戶能夠通過按菜單按鈕註銷。我的問題是,如何清除Android Stack的活動?

A)的Android不會讓你終止應用程序和
B),甚至當我向用戶發送至LoginActivity他們又可以隨時按和馬上回以前的活動他們在

我已經嘗試用以下兩個標誌啓動活動:

Intent intent = new Intent(this, LoginActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);   
startActivity(intent); 

我也跟自己都逐一嘗試。

我也試過在startActivity(intent)之後撥打finish(),因爲我在另一個StackOverflow 問題中讀到。

+0

您必須在清單中將您的活動聲明爲單個實例。 – Falmarri 2010-11-16 02:29:43

+0

類似於[Android:清除背面堆棧](http://stackoverflow.com/questions/5794506/android-clear-the-back-stack) – 2012-08-22 15:00:09

回答

35

在您登錄活動,覆蓋後退按鈕,所以它隱藏你的應用程序,而不是整理活動:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     moveTaskToBack(true); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

此外,一定要設置的android:對根系活力alwaysRetainTaskState =「真」,因此Android不會在用戶閒置30分鐘後清除堆棧(包括登錄活動)。

然後只要在成功登錄時調用finish()。

+8

謝謝,你的代碼讓我走上了正確的道路,但是這會做相同:@Override public void onBackPressed(){ moveTaskToBack(true); } – Totic 2010-11-16 05:16:08

+0

好的,所以我有一個用戶不斷在活動之間切換,這意味着他們可能在20秒內切換了15個活動。這可能是內存不足錯誤的原因嗎?我該怎麼做才能解決它?謝謝! – 2016-01-05 06:00:39

3

設置Intent.FLAG_ACTIVITY_CLEAR_TOP已經爲我工作在一個非常相似的情況下,我沒有設置Intent.FLAG_ACTIVITY_NEW_TASK標誌。你有沒有試過?

42

這應該按位OR'd或最終覆蓋較早的標誌。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

像這樣:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
+0

我已經嘗試了很多次,但沒有得到所需的結果。請幫助我 – amity 2011-09-24 08:27:10

+30

工作的唯一方法是如果您嘗試啓動的活動已在活動堆棧中。 Android Y U SO WEIRD? – mxcl 2012-03-08 18:16:01

+0

這不適用於API級別<11。檢查我的[answer](http://stackoverflow.com/a/24352988/636561)是否符合API級別> = 1的解決方案。 – 2014-06-22 16:15:07

6

如果您正在使用Android API 11或以上,你可以使用下面的代碼來清除棧。

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
+0

好的,所以我有一個用戶不斷地在活動之間切換,這意味着他們可能在20秒內切換了15個活動。這可能是內存不足錯誤的原因嗎?我該怎麼做才能解決它?謝謝! – 2016-01-05 06:01:10

1
Intent intent = new Intent(this, LoginActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);   
startActivity(intent); 

寫本及注意事項:LoginActivity必須首先推出,啓動和

,如果你寫的任何發射模式的標誌被覆蓋其目的,所以刪除launchermode和嘗試,你一定會得到它

31

根據WakkaRemoving an activity from the history stack ...


添加android:noHistory="true"屬性您<activity>AndroidManifest.xml這樣的:

<activity android:name=".MyActivity" 
    android:noHistory="true"> 
</activity> 
+1

+1。正是我想要的.. !! :) – 2014-05-15 07:36:13

+2

完美!這很簡單 – 2014-07-06 17:37:23

+0

完美的一個謝謝 – 2014-07-09 14:34:16

2

這項工作對我來說:)

Intent main = new Intent(this, A_Activity.class); 
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
    | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(main); 

Intent tool = new Intent(this, B_Activity.class); 
startActivity(tool); 
finish(); 

其中A是我的例如根系活力

當我打電話給sta時,我有活動A→B→C→D rt activity E on stack I have now A - > E

我不知道是不是很好:)但作品。

+0

好的,所以我有一個用戶不斷地在活動之間切換,這意味着他們可能在20秒內切換了15個活動。這可能是內存不足錯誤的原因嗎?我該怎麼做才能解決它?謝謝!' – 2016-01-05 06:01:28

+0

@RuchirBaronia它不應該導致內存不足。可能有些東西讓你在記憶中的活動:) 檢查:http://blogs.innovationm.com/android-out-of-memory-error-causes-solution-and-best-practices/ – 2016-01-05 15:55:17

5

這不會清除你的活動回棧。

即使按照以上所有答案,當我按下後退按鈕它顯示關閉應用程序之前的第二秒的最後一個活動。

這是我做過什麼:

@Override 
public void onBackPressed() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(startMain); 
} 

現在在沒有任何麻煩回按:)我的應用程序退出。

+0

請記住這一點在比較答案時,在Froyo和Cupcake的SDK版本之間發生了變化。換句話說,2010年以某種方式發揮作用的東西現在可能會有所不同。 – Brandon 2014-03-10 04:01:31

+0

是的,你是對的。我會記住這一點。謝謝。 – amalBit 2014-03-10 05:27:27

+0

此代碼不起作用 – 2014-03-15 09:33:05

0

如果我們使用此代碼來發動登錄活動(A):

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 

活動應該在活動堆棧,否則該標誌將不會有任何效果。

如果我們在登錄活動(A)中使用finish(),在啓動活動(B)(爲了避免從B返回到A)之後,活動A(登錄)將不在堆棧中。當登錄活動具有「noHistory」屬性時完全相同。

所以,對我來說,解決辦法是其他混合響應:

此代碼放在活動B,避免再回到登錄活動:

@Override 
public void onBackPressed() { 
    moveTaskToBack(true); 
    super.onBackPressed(); 
} 

而這種代碼放在它調用註銷功能活動:

public static void logout() { 
    Intent intent = new Intent(activity, LoginMain.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
} 
1

試試這個

Intent intent = new Intent(this, MainActivity.class); 
intent.addFlags(
    Intent.FLAG_ACTIVITY_CLEAR_TOP | 
    Intent.FLAG_ACTIVITY_CLEAR_TASK | 
    Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);