java - studio - intent getaction




你如何使用Intent.FLAG_ACTIVITY_CLEAR_TOP來清除活動堆棧? (7)

我已經閱讀了幾篇關於使用它的帖子,但必須遺漏一些因為它不適合我。 我的活動A在清單中有launchmode =“singleTop”。 它啟動活動B,啟動模式=“singleInstance”。 活動B打開瀏覽器並接收和意圖返回,這就是為什麼它是singleInstance。 我試圖覆蓋後退按鈕,以便用戶被發送回活動A,然後可以按Back返回活動,而不是再次返回活動B.

// activity B
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
  && keyCode == KeyEvent.KEYCODE_BACK
  && event.getRepeatCount() == 0) onBackPressed();
 return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
 startActivity(new Intent(this, UI.class)
 .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
 return;
}

從瀏覽器返回後,堆棧是...... A,B,瀏覽器,B

我希望這段代碼能夠將堆棧更改為... A ...以便再次按下後再將用戶帶回主屏幕。

相反,它似乎將堆棧更改為... A,B,瀏覽器,B,A ......好像那些標誌不在那裡。

我嘗試在startActivity之後調用活動B中的finish(),但後面的按鈕再次將我帶回瀏覽器!

我錯過了什麼? 謝謝!


@bitestar有正確的解決方案,但還有一個步驟:

它隱藏在文檔中,但是您必須將ActivitylaunchMode更改為standard以外的任何內容。 否則它將被銷毀並重新創建,而不是重置到頂部。


FLAG_ACTIVITY_NEW_TASK是一個問題,它啟動一個新任務。除去它,你就完成了。

好吧,我建議你在使用它們之前閱讀每個Flag所做的事情

在這裡閱讀thisIntent Flags


我使用三個標誌來解決問題:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
                Intent.FLAG_ACTIVITY_CLEAR_TASK | 
                Intent.FLAG_ACTIVITY_NEW_TASK);

我在啟動新意圖後調用了activity_name.this.finish() ,它對我有用。

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

但它對我不起作用......我不是建議使用這個解決方案,但如果設置標誌對你不起作用,你可以嘗試這個..但我仍然建議不要使用它


我知道已經有一個已經接受的答案,但我不知道它對OP的作用是什麼,因為我不認為FLAG_ACTIVITY_CLEAR_TOP在他的特定情況下是有意義的。 該標誌僅與同一任務中的活動相關。 根據他的描述, 每個活動都有自己的任務 :A,B和瀏覽器。

可能讓他失望的是A是singleTop,當它應該是singleTask時。 如果A是singleTop,而B開始A,那麼將創建一個新的A,因為A不在B的任務中。 從singleTop的文檔:

“如果活動的實例已存在於當前任務的頂部,則係統會將意圖路由到該實例......”

由於B啟動A,當前任務是B的任務,這是針對singleInstance的,因此不能包括A.使用singleTask在那裡實現所需的結果,因為系統將找到具有A的任務並將該任務帶到前台。

最後,在B啟動A並且用戶從A按下後,OP不希望看到B或瀏覽器。 為此,在B中調用finish()是正確的; 同樣,FLAG_ACTIVITY_CLEAR_TOP不會刪除A任務中的其他活動,因為他的其他活動都在不同的任務中。 但是他缺少的部分是B在觸發瀏覽器的意圖時也應該使用FLAG_ACTIVITY_NO_HISTORY。 注意:如果瀏覽器在啟動OP的應用程序之前已經運行,那麼當然從A回來時你會看到瀏覽器。所以要真正測試它,一定要在啟動應用程序之前退出瀏覽器。


最初我也遇到了使FLAG_ACTIVITY_CLEAR_TOP工作的問題。 最終我通過使用它的值(0x04000000)使它工作。 所以看起來有一個Eclipse /編譯器問題。 但不幸的是,倖存的活動重新啟動,這不是我想要的。 所以看起來沒有簡單的解決方案。


雖然這個問題已經有了足夠的答案,但我想有人會想知道為什麼這個標誌以這種特殊的方式工作,這就是我在Android文檔中找到的

上例中活動B的當前運行實例將在其onNewIntent()方法中接收您從此處開始的新意圖,或者本身已完成並使用新意圖重新啟動。

如果它已將其啟動模式聲明為“多個”(默認值),並且您沒有在同一意圖中設置FLAG_ACTIVITY_SINGLE_TOP,那麼它將被完成並重新創建; 對於所有其他啟動模式或如果設置了FLAG_ACTIVITY_SINGLE_TOP,則此Intent將被傳遞到當前實例的onNewIntent()。


所以,要么,
1 。 將Activity A的launchMode從標準(即singleTask或其他)更改為其他內容。 然後您的標誌FLAG_ACTIVITY_CLEAR_TOP將不會重新啟動您的活動A.

要么,

2 。 使用Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP作為你的旗幟。 然後它會以你想要的方式工作。





android-manifest