2012-07-18 37 views
2

我真的不明白所有這些標誌是如何工作的,因爲我完全按照doc的說法進行操作,並沒有解決我的問題。我的活動是這樣啓動的:(第一)活動A - >活動B - >(第二)活動A.如果我按下按鈕,它將返回到活動B - >活動A - >退出應用程序。現在我想從活動B中提到的第二個活動A中,按回來時,它將立即跳過活動B和第一個活動A並退出應用程序。下面的代碼:Android FLAG_ACTIVITY_CLEAR_TOP無法正常工作?

從A到B:

TabActivityGroupAbs parentActivity = (TabActivityGroupAbs) ((Activity) ctx).getParent(); 
detailIntent = new Intent(parentActivity, B.class); 
parentActivity.startChildActivity("BFromA", detailIntent); 

從B到A:

TabActivityGroupAbs parentActivity = (TabActivityGroupAbs) ((Activity) ctx).getParent(); 
detailIntent = new Intent(parentActivity, A.class); 
detailIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
detailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
parentActivity.startChildActivity("AFromB", detailIntent); 

從B到A,我添加了標誌FLAG_ACTIVITY_CLEAR_TOP。但它並沒有說明什麼。當我按下時,它仍然進入活動B,然後再次進入A.我做錯了什麼?

而且看起來好像沒有一個標誌可以工作。從A到B,我把:

detailIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 

它應該阻止B放到活動堆棧。但事實並非如此。從第二項活動A開始,按回時它仍然回到B.

現在我應該怎麼做才能退出應用程序,而不是從第二個活動去回到B A.

編輯:我忘了提。從B到A,如果我調用finish()來終止活動B,那麼從第二個活動A返回時,它將返回到第一個活動A.爲什麼活動A在這裏有兩個實例,雖然我設置了FLAG_ACTIVITY_CLEAR_TOP?真奇怪。

回答

0

您可以使用下面的方法來啓動和關閉子活動

public ArrayList<String> mIdList; 
/** 
* Starts an Activity as a child Activity to this. 
* 
* @param Id 
*   Unique identifier of the activity to be started. 
* @param intent 
*   The Intent describing the activity to be started. 
* @throws android.content.ActivityNotFoundException. 
*/ 
public void startChildActivity(String Id, Intent intent) { 
    Window window = getLocalActivityManager().startActivity(Id, 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
    if (window != null) { 
     mIdList.add(Id); 
     setContentView(window.getDecorView()); 
    } 
} 

/** 
* This is called when a child activity of this one calls its finish method. 
* This implementation calls {@link LocalActivityManager#destroyActivity} on 
* the child activity and starts the previous activity. If the last child 
* activity just called finish(),this activity (the parent), calls finish to 
* finish the entire group. 
*/ 
@Override 
public void finishFromChild(Activity child) { 
    LocalActivityManager manager = getLocalActivityManager(); 
    int index = mIdList.size() - 1; 

    if (index < 1) { 
     finish(); 
     return; 
    } 

    manager.destroyActivity(mIdList.get(index), true); 
    mIdList.remove(index); 
    index--; 
    String lastId = mIdList.get(index); 
    Intent lastIntent = manager.getActivity(lastId).getIntent(); 
    Window newWindow = manager.startActivity(lastId, lastIntent); 
    setContentView(newWindow.getDecorView()); 
} 

例子:

startChildActivity("Merchants", new Intent(this,MerchantScreen.class)); 
+0

你的回答給我關於我的應用程序發生了什麼大的建議。謝謝 – user1417127 2012-07-18 05:59:19

+0

樂意幫忙:) .. – san 2012-07-18 09:36:45

6
From B to A, I add the flags FLAG_ACTIVITY_CLEAR_TOP. But it didn't clear anything. When I pressed back, it still went to Activity B, and then A again. What did I do wrong? 

FLAG_ACTIVITY_CLEAR_TOP清除中間活動不是以前的活動,從堆棧中刪除活動B你必須在致電A時致電完成()B活動A

+1

如果我叫完()殺死活動B,然後從第二個活動A,當回頭時,它回到第一個活動A – user1417127 2012-07-18 04:13:39

+0

不能完成活動A當調用活動B? – 2012-07-18 04:14:41

+0

我想從B復出,所以沒有。 – user1417127 2012-07-18 04:21:25

18

一次讀它,你將永遠不會有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

有沒有辦法清除所有其他活動? – 2014-05-08 12:25:28

+1

很好解釋。 我想要做的是 A-> B-> C-> D-> A當我再次打電話給A時,我希望B和C離開。有什麼建議麼? – iZBasit 2015-08-20 06:03:56

+0

@iZBasit無法理解您的確切場景。你能解釋一下嗎?你想繞過B和C,或者當你從D回到A時想顯示它們。 – 2015-08-24 06:39:45