2011-08-30 144 views
0

我有活動A,啓動活動B(singleInstance)。在活動B有一個返回按鈕,開始意圖活動A.Android活動導航流問題

A - >乙 - >

我想達到以下行爲:

用戶觸發B於A,後按下後退按鈕,返回到活動A並按設備的硬件返回按鈕,將其導航至設備的主屏幕。

現在看起來像這樣: 用戶在A上觸發B,然後按下後退按鈕,返回到活動A並按設備的硬件返回按鈕,再次將他導航到活動A,然後再次按返回按鈕並打開活動B.然後他按下按鈕和活動A發生,它是一個無限循環....

我不能使用標誌NO_HISTORY,因爲我想從其他一些原因保存活動B的狀態。 Activity B是一個web瀏覽器,所以我已經重載了onSaveInstanceState和onRestoreInstanceState方法來保存已加載的緩存網站。

現在我在活動A中重載onBackPressed方法,通過開始一個意圖到主屏幕,但它不是一個好的解決方案。

您有任何其他想法嗎?

下面是代碼:

活動A: Intent browser = new Intent(this, B.class); this.startActivity(browser);

活性B: `@Override 公共無效的onSaveInstanceState(捆綁savedInstanceState){super.onSaveInstanceState(savedInstanceState);新的對象[] {savedInstanceState}); } @Override public void onRestoreInstanceState(Bundle savedInstanceState){ super.onRestoreInstanceState(savedInstanceState);

callWebViewMethod("restoreState", new Class[] { Bundle.class }, 
      new Object[] { savedInstanceState }); 
} 
@Override 
public void onBackPressed() { 
    if (webView != null) { 
     if ((Boolean)callWebViewMethod("canGoBack")) 
     { 
      callWebViewMethod("goBack"); 
     } 
     else 
     { 
      startActivity(getBackIntent()); 
     } 
    } 
} 
private Intent getBackIntent() { 
    Intent i = new Intent(); 
    // some code here   
    i.setClass(this, A.class); 
    return i; 
}` 

回答

2

如果你不想導航回活動,你可以嘗試把finish();後您的startActivity();

+0

。我也嘗試在活動B到A的意圖上使用FLAG_ACTIVITY_CLEAR_TOP標誌,但它也不能按預期工作。 –

3
after that press my back button 

finish() activity B這裏..

從活動爲您提供刪除onBackPressed方法。

+0

當我把完成()放在Activity B中時,我將丟失加載的網頁,我不想要它。 –

2

在您的代碼:

@Override 
    public void onBackPressed() { 
    if (webView != null) { 
     if ((Boolean)callWebViewMethod("canGoBack")) 
     { 
      callWebViewMethod("goBack"); 
     } 
     else 
     { 
      startActivity(getBackIntent()); 
     } 
    } 
} 

您不需要創建一個新的意圖返回到活動A只是擺脫其他條件。

@Override 
    public void onBackPressed() { 
     if (webView != null) { 
      if ((Boolean)callWebViewMethod("canGoBack")) 
      { 
       callWebViewMethod("goBack"); 
      } 
     } 
     else { 
      super.onBackPressed(); // pass to the default handler 
     } 
    } 
+0

是的,它在活動B中按預期工作,但是當我返回到活動A時,它會創建另一個實例,然後當我按下後退按鈕時,它會返回活動B.請參閱下面的內容: A1→B→A​​2 - > A1 - > B - > A - > B - > ... –

+0

您可以發佈您的活動A和活動B類中的代碼嗎? – C0deAttack

+0

我已更新我的帖子。 – C0deAttack

0

不要重寫onBackPressed,不要調用finish。 當你開始每個活動,當我把完成()在活動B,我將失去加載的網頁,我不希望它設置的意圖標誌來

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 
+0

如果我將活動A重新排序,我仍然會有活動B.我想通過按下返回按鈕從活動A轉到設備的主屏幕。 現在我有A1→B→A​​2→A1→B→A​​→B→....我會有A→B→A→B→A→B 請注意比在活動BI已覆蓋onBackPressed方法創建新的意圖,這就是它循環的原因。問題是,如何從backButton導航歷史中保存Web瀏覽器狀態並清除活動B? –

+0

正如我的建議 - 不要覆蓋onbackPressed。您將只有一個A和B的實例。如果您從A再次訪問B,它將處於與通過後退按鈕離開時相同的狀態 – NickT