2012-08-14 100 views
3

在我的菜單我有一些項目。 Home是我想要成爲我的應用程序的根的一個項目,每當用戶點擊它時,Android清除棧然後回到主屏幕。的Android,Intent.FLAG_ACTIVITY_CLEAR_TOP似乎不起作用?

這是我的代碼:

menu.setOnItemClickedListener(new MenuClickedListener() { 
      public void eventOccured(int id) {   

       Intent intent = null; 
       switch(id) { 
        case 1: intent = new Intent(context, More.class);   break; 
        case 2: intent = new Intent(context, FavoriteScreen.class); break; 
        case 3: intent = new Intent(context, VideoShowList.class); break; 
        case 4: intent = new Intent(context, ShoppingList.class); break; 
        case 5: intent = new Intent(context, MainScreen.class); 
          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
          break;     
       }  

       if(intent != null) 
        context.startActivity(intent); 
      } 
     }); 

菜單工作正常,但似乎標誌並不因爲從主屏幕上的工作,我去第二和第三屏幕,然後我點擊菜單的首頁項目回來到主屏幕。現在,當我點擊後退按鈕時,我轉到第三屏幕,第二屏幕和主屏幕。

我設計了這個菜單,窗口小部件,以建立它一次,並重新使用我所有的屏幕。

任何建議,將不勝感激。謝謝。

回答

6

嘗試使用此intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);地質儲量intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Intent intent = new Intent(getApplicationContext(), 
      yourActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    startActivity(intent); 
+1

我以爲是一樣的,原因'混亂的是,如果沒有添加標誌,那麼我們使用addFlag()else setFlag()什麼魚! – 2012-08-14 05:19:42

-2

也許這個作品:

intent = new Intent(getApplicationContext(), MainScreen.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
+3

與代碼無關。 – 2012-08-14 03:28:28

9

一切似乎都很正常,解釋如何 enter image description here

如果已經有存在於堆棧中的所謂活動類型的實例,那麼這種情況下被帶到前臺 而不是創建一個新的實例。此外,在堆棧駐留在該實例之上的所有活動都從 棧清除。

例如,假設當前活動堆棧是ABCDE,È啓動一個活動C(用標誌清除頂部)將清除活動ð 和E從任務,並導致在堆疊ABC

+0

謝謝親愛的hotveryspicy,也許我沒有很好地解釋我的問題。其實,我熟悉它的理論。這就是我使用它的原因。我的問題是在活動E中,當我回到活動C時,那麼當我點擊返回按鈕時,我預計不會再進入活動E.然而,根據我的代碼,我可以回來看起來棧(在你的情況下活動E和D)沒有清除。 – Hesam 2012-08-14 03:51:49

+0

哪個是您的第一個活動,首頁? – 2012-08-14 03:55:30

+0

MainScreen.class是我的第一個活動。 – Hesam 2012-08-14 03:59:32

17

一次讀它,你將永遠不會有FLAG_ACTIVITY_CLEAR_TOP

這裏的使用問題是關於FLAG_ACTIVITY_CLEAR_TOP的使用簡單的澄清。其正確的使用

一個襯裏公式:

它總是清除調用活動和被叫活動之間的中間活動(如果有的話)。

下面是一個活動流程:

活性A - >活動B - >活動C(使用標誌活動清楚頂部去d) - >活動d

在上述序列中伸手d。如果我們按下回來時,那麼我們將獲得活動C->活動B->活動A因爲有活動C和活動d

之間沒有中間活動210

神話這裏一些開發商爲 - 。

使用標誌的活動,從清除C頂部到達活動d後,他們期待的是從d返回鍵的按下會帶他們到應用程序之外, 這將永遠不會發生

FLAG_ACTIVITY_CLEAR_TOP總是總是清除中間活動兩項活動之間。如果任何

+4

很好的解釋。如果你將解決方案包含在每個人都想要的內容中,會更好 - 讓活動成爲剩下的唯一一個活動。 – Jaroslav 2014-10-23 13:59:01

19

我已經試過Intent.FLAG_ACTIVITY_CLEAR_TOP但還沒有得到妥善的解決辦法,以便最終這有助於我

 

Intent intent = new Intent(getApplicationContext(), LoginActivity.class); 
ComponentName cn = intent.getComponent(); 
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn); 
startActivity(mainIntent); 
 

這將清除所有堆棧並僅運行登錄活動

+0

這是唯一爲我工作的人。 – yuttadhammo 2014-11-29 07:52:05

+0

非常感謝。它的工作原理 – 2015-07-29 15:23:34

+0

這是如此之好 – lelloman 2016-07-12 12:11:31

1

如果你想開始一個活動是唯一一個現有的(即,清除整個堆棧中),使用下面的選項:

Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK 

需要API級別> = 11

0

我遇到了同樣的問題,我的問題是intent中的activity有launchMode =「singleInstance」。更改爲singleTask並且代碼正常工作。