2010-09-29 36 views
3

我的應用程序有許多活動,可以以任意順序如何清除Android應用程序的所有活動

例活動歷史被稱爲: 甲 - >乙 - 「ç - > d - > A - >乙 - > E

現在在活動E中,我正在'取消註冊'設備(將用戶註銷並刪除可能已下載到他們的SD卡的任何數據)。期望的行爲是應用程序'重新開始',並且用戶被提示登錄活動並且回擊將使用戶返回到主屏幕。

所以現在,活動E應該以某種方式清除活動堆棧。目前,當從E啓動A的意圖時,我正在設置FLAG_ACTIVITY_CLEAR_TOP。問題是,當用戶訪問A然後進入中間活動並在去E之前重新訪問A時,堆棧上仍然存在活動。

甲 - >乙 - 「ç - > d - >一個

那麼該用戶已被註銷,不能使用活動BD,但如果用戶點擊從活動一回,他們可以訪問活動BD。是否有一種簡單的方法可以將除登錄活動以外的所有活動從堆棧中清除?

更新:

所以我試着更新我的BaseActivity(每個活動我的應用程序子類中的一個),包含靜態標誌isDeregistering,告訴活動,如果真要毀滅自己。問題在於,每個活動都會調用finish(),並且我會啓動到主屏幕,並且無法重新啓動應用程序,直到關閉應用程序。有一個更好的方法嗎?

+1

這很奇怪,通過閱讀FLAG_ACTIVITY_CLEAR_TOP上的文檔,它說:例如,考慮一個由活動組成的任務:A,B,C,D。如果D調用startActivity(),並將Intent解析爲組件的活動B,那麼C和D將完成,並且B收到給定的意圖,導致堆棧現在是:A,B。 這似乎意味着如果您開始意圖使用該標誌A,所有中間活動應該完成... – I82Much 2010-09-29 22:31:04

+0

是的,這是行爲,只有A活動在堆棧中兩次。當堆棧被清除時,它會在調用活動和接收活動的第一個實例之間清除,因此A活動的兩個實例之間的任何內容都會保留在堆棧上。 – danh32 2010-09-30 01:28:30

回答

3

我已經想出了一個可行的解決方案。以下代碼進入我的BaseActivity類。

public boolean killIfDeregistering() { 
    if (isDeregistering) { 
     Log.d(TAG, "deregistering true!"); 
     if (getClass().getName().equals(LoginActivity.class.getName())) { 
      //don't destroy activity, reset flag 
      Log.d(TAG, "stopping deregister process!"); 
      isDeregistering = false; 
     } else { 
      //finish the activity 
      Log.d(TAG, "killing this activity!"); 
      finish(); 
      return true; 
     } 
    } 
    return false; 
} 

使用了一下反思,我可以決定是否要殺死基地活動,使家庭發射器可以重新啓動在LoginActivity應用。我只需要確保LoginActivity在通過手動調用finish()執行登錄後不會保留在堆棧中。

+0

這個作品很神奇... – Panache 2011-06-21 12:37:22

0

如果您想從活動E返回到第一個活動A,銷燬所有中間活動,您可以使用FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_CLEAR_TOP

相關問題