2011-07-22 110 views
-1

我正在嘗試做類似於this的問題。清除Android背堆棧

我有一個主要的應用程序A和子應用程序B和C. B是一個可搜索的字典,C是一個定義,所以如果你搜索很多單詞,你可以結束堆棧看起來像A> B> C> B> B> C> B> C> C> C ...等等

每當我回去,我想回到原來的B,所以我想要回棧基本上始終呆在A> B。

我目前已經使用Intent設置了它,所以當從C按下後退按鈕時,它會轉到B的新實例,但這顯然不是我想要的。

想法?

+1

您是否看過[這裏]概述的不同launchModes(http://developer.android.com/guide/topics/manifest/activity-element.html#lmode)? singleTop,singleTask或singleInstance模式可能會提供您正在查找的行爲。 – theisenp

+0

我其次。看看不同的標誌,看看他們是否可以提供幫助。雖然如果你從C打回來,它不應該把你帶到原來的B嗎? – Rob

+0

除了當我嘗試從C啓動一個新的B時,它們會回到原始的B,我想要一個以這種方式啓動的新創建的標誌,但是原來的標誌會在後退按下時發生。 – Jdban101

回答

2

不應該從C打回你帶到原來的B?因此,堆棧應該是這樣的:

A> 
    B> 
    C< 
    B> 
    C> 
     C< 
    C< 
    B< 
A 

與>去到下一個活動,並<是後退按鈕?

你可以重載onBackPressed所有的活動,所以對於C它加載一個新的B,B它加載一個新的A,你會做moveTaskToBack(true);,但這不是一個解決方案和更多的黑客做它工作。

嘗試使用onResume,以便B在默認情況下出現。將任何相關變量設置爲它們在新活動中的含義。如果你只想從C來的時候想要這個,那麼當C加載時,有一個布爾類型設置爲true,並在onResume或onRestart中檢查它。如果是,則將所有內容設置爲默認/空白,並將布爾值設置爲false。如果沒有,加載它是如何(這是如果他們打回家,回到應用程序,基本上)。我不是在我的辦公桌,但我想你會想:

@Override 
    public void onResume() { 
     super.onResume(); 
     if(fromC == true){ 
     //Set all variables to load default dictionary 
     fromC = false; 
     } 
    } 
} 

這應該使正本提單的行爲像一個新的B.

或者相反,你能做到這一點的簡單方法,當你打電話的意圖來加載一個新型B這樣的:

startActivity(getIntent()); 
finish(); 

這會讓有隻有一個B.使當你回到其加載爲空白是有點不同,需要類變量,或者我想到的其他一些棘手的技巧。這就像你想要做的事情:.zip of small sample

如果你可以把你的代碼改寫成幾乎這樣的東西(如果這有什麼意義,你可以使用適當的變量來設置正確的工作) 。

+0

我只是想: A> B> ç< B> C> ç< 如你所說,它終於實現了,你預測。 問題來自當我去到B的新實例,所以: A> B> C> B> ç< 在這種情況下,我想最後的C返回到原來的B,否則我們可能會產生一個巨大的後鏈。 編輯:(試圖格式化這個權利,有問題) – Jdban101

+0

我明白你的意思,但爲什麼你想要一個新的B實例呢? – Rob

+0

B基本上是主要的字典頁面,你可以在開始時瀏覽所有的單詞。如果您搜索,則會再次打開B並向您顯示與該搜索匹配的所有單詞(例如,您搜索'a'並且所有a都會彈出並且您可以滾動瀏覽它。我想回到所有單詞的完整滾動頁面是最好的,而不是退出並重新打開,如果你想再次頁面。 – Jdban101

2
@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (splash.sdk < 5 && keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
      onBackPressed(); 
     } 

     return super.onKeyDown(keyCode, event); 
    } 
    //This will make the back button exit the app to the home screen. 
    @Override 
    public void onBackPressed() { 
     moveTaskToBack(true); 
     return; 
    } 
+1

我認爲OP想阻止同一活動的多個實例在同時,每次按下後退時都不會退出到主屏幕。 – theisenp

+0

splash.sdk,呃?很高興看到我的例子重新使用! :D你需要爲此獲取SDK版本,在這個例子中,它最容易投入啓動畫面。 'int sdk = new Integer(Build.VERSION.SDK).intValue();'然後你只需要'sdk <5 && keycode ...'來代替。 – Rob

0

您可以設置一個Intent標誌來執行此操作。說你在Activity C,你想打電話給Activity B:你給Intent添加一個標誌叫做FLAG_ACTIVITY_CLEAR_TOP。所以:

class C extends Activity { 

    //... 

    private void gotob() { 
     Intent go = new Intent(this, B.class); 
     go.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(go); 
    } 

    //... 

} 

這樣做是要麼去在後面堆棧B(和明確的一切離頂部)的頂部實例,或者如果沒有創建一個新的實例。我還沒有制定出是否有辦法通過啓動標誌來做到這一點 - 雖然有一些類似的模式,但我不認爲它們是完全相同的。