2012-07-06 17 views
6

chciałbym zmodyfikować tylną stos w mojej aplikacji Android jako takie:Modyfikacja stos w Androidzie

Teraz tutaj jest przepływ:

A -> B -> C -> D -> E -> F

Chcę móc modyfikować tylny stos, tak aby po przejściu do aktywności F, D i E zostały usunięte ze stosu. więc przepływ wynosi F -> C, jeśli użytkownik trafi w tył.

Ponadto, od F użytkownik może przejść do czynności B, to powinno również usunąć C, D, E i F.

Widziałem pewne informacje na temat możliwości wyczyszczenia stosu lub usunięcia górnego przedmiotu, ale chcę usunąć pewną liczbę przedmiotów ze stosu, gdy aktywowane jest działanie.

Każda pomoc jest doceniana, bardzo dziękuję.

Odpowiedz

9

Możesz zbudować intencję z flagą intent.FLAG_ACTIVITY_CLEAR_TOP z F na C. Następnie będziesz musiał wywołać funkcję startActivity() z intencją i wywołać to w przypadkuBackPressed lub coś podobnego.

Intent i = new Intent(this, C.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(i) 

Zobacz tę odpowiedź, która również zajmuje się zapewnienie, że C nie zostanie uruchomiony ponownie po przejściu z powrotem do niego: https://stackoverflow.com/a/11347608/1003511

Co FLAG_ACTIVITY_CLEAR_TOP zrobi to udać wrócić do ostatniej instancji działalności C na stosie, a następnie usuń wszystko, co znajduje się powyżej. Może to jednak spowodować odtworzenie działania. Jeśli chcesz upewnić się, że będzie to ta sama instancja działania, użyj również FLAG_ACTIVITY_SINGLE_TOP. Z dokumentacji:

aktualnie działającej instancji działalności B w powyższym przykładzie albo otrzymać nową intencję jesteś począwszy tutaj w sposobie jego onNewIntent(), lub być sama wykończone i ponownie z nowym zamiar. Jeśli zadeklarowało, że tryb uruchamiania ma wartość "wiele" (domyślnie: ) i nie ustawiono FLAG_ACTIVITY_SINGLE_TOP w tej samej intencji , to zostanie ono zakończone i ponownie utworzone; dla wszystkich innych trybów uruchamiania lub jeśli FLAG_ACTIVITY_SINGLE_TOP jest ustawiona, ta intencja będzie dostarczona do bieżącej instancji naNewIntent().

Edit: Oto przykładowy kod podobny do tego, co chcesz zrobić:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     Intent a = new Intent(this, C.class); 
     a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     startActivity(a); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

przykładowy kod źródłowy: https://stackoverflow.com/a/9398171/1003511

+0

To było idealne. Bardzo dziękuję za pomoc. – mwrazam

2

Potrzebne jest android:excludeFromRecents="true", które należy dodać w znaczniku aktywności w pliku manifestu. Zatrzymuje wszystkie działania, aby przejść do stosu, który ma ten znacznik w znaczniku aktywności w manifeście.

Przykład kodu

<activity 
      android:name="com.xx.xx.ActivityName" 
      android:excludeFromRecents="true" 


     </activity> 

i upewnij się, że zadzwonisz finish() (po uruchomieniu innej działalności) metody w tych aktywności nie chcesz być na działalności stosie.

+0

Witam, uczyniłoby to działalność całkowicie zniknąć z historii, która ISN czego chcę. Chcę, aby działalność zniknęła dopiero po zwolnieniu pewnej innej działalności. Dzięki za pomoc! – mwrazam