2010-11-16 13 views
52

Mam aplikację z kilkoma działaniami w Androidzie i chcę, aby użytkownik mógł się wylogować, naciskając przycisk menu. Problemem jest to, że mamJak wyczyścić Android Stack działań?

A) Android nie pozwala zamknąć aplikację i
b) nawet kiedy wysłać użytkownika do LoginActivity ponownie zawsze mogą nacisnąć powrotem i dostać z powrotem do poprzedniego aktywność byli w

ja już próbował uruchomić aktywny z dwóch następujących flag:.

Intent intent = new Intent(this, LoginActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);   
startActivity(intent); 

próbowałem też z każdym z nich sami.

Próbowałem również wywoływać finish() po startActivity(intent), jak czytam w innym pytanie StackOverflow .

+0

Musisz zadeklarować swoją aktywność jako pojedynczą w swoim manifeście. – Falmarri

+0

podobny do [Android: wyczyść tylny stos] (http://stackoverflow.com/questions/5794506/android-clear-the-back-stack) –

Odpowiedz

35

W swojej działalności logowania, zastępują przycisk wstecz, więc ukrywa swoją aplikację zamiast kończąc działalność:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     moveTaskToBack(true); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

Również należy ustawić android: alwaysRetainTaskState = „true” na aktywność korzeni, więc Android nie wyczyści twojego stosu (w tym aktywności logowania) po 30 minutach braku aktywności od użytkownika.

Następnie wystarczy wywołać finish(), gdy pomyślnie się zalogujesz.

+8

Dzięki, twój kod dostał mnie we właściwej ścieżce, ale to zrobi to samo: @Override public void onBackPressed() { moveTaskToBack (true); } – Totic

+0

Dobrze, więc mam użytkownika, który ciągle przełącza się między czynnościami, co oznacza, że ​​mógł przełączyć 15 czynności w ciągu 20 sekund. Czy to może być przyczyną błędu braku pamięci? Co powinienem zrobić, żeby to naprawić? Dzięki! –

3

Ustawienie Intent.FLAG_ACTIVITY_CLEAR_TOP zadziałało dla mnie w bardzo podobnym przypadku, w którym nie ustawiłem flagi Intent.FLAG_ACTIVITY_NEW_TASK. Czy próbowałeś bez?

42

Powinno to być bitowe w stanie "OR" lub w przeciwnym razie nadpisanie wcześniejszej flagi.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

tak:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
+0

Próbowałem go wiele razy, ale nie uzyskałem wymaganego wyniku. Proszę pomóż mi – amity

+30

Jedynym sposobem jest to, czy aktywność, którą próbujesz uruchomić, jest już w stosie aktywności. Android Y U SO WEIRD? – mxcl

+0

To nie zadziała z poziomem interfejsu API <11. Sprawdź mój [odpowiedź] (http://stackoverflow.com/a/24352988/636561) dla rozwiązania zgodnego z poziomem interfejsu API> = 1. –

6

Jeśli używasz Android API 11 lub powyżej, można użyć następującego kodu, aby usunąć cały stos.

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
+0

Okej, więc mam użytkownika, który ciągle przełącza się między czynnościami, co oznacza, że ​​mógł przełączyć 15 czynności w ciągu 20 sekund. Czy to może być przyczyną błędu braku pamięci? Co powinienem zrobić, żeby to naprawić? Dzięki! –

1
Intent intent = new Intent(this, LoginActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);   
startActivity(intent); 

napisać to i uwaga: LoginActivity musi najpierw zostać uruchomiony jako Launcher i

jeśli piszesz każdy wyrzutnia trybach flagi są zastępowane swój cel, więc usunąć launchermode i spróbuj na pewno dostać to

31

Zgodnie z Wakka w Removing an activity from the history stack ...


Dodaj android:noHistory="true" atrybut do Twojego <activity> w AndroidManifest.xml tak:

<activity android:name=".MyActivity" 
    android:noHistory="true"> 
</activity> 
+1

+1. Dokładnie to, czego chciałem ... !! :) –

+2

Idealny! to jest proste –

+0

Idealne jedno dziękuję –

2

To praca dla mnie :)

Intent main = new Intent(this, A_Activity.class); 
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
    | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(main); 

Intent tool = new Intent(this, B_Activity.class); 
startActivity(tool); 
finish(); 

Gdzie A jest moja aktywność korzeni np

Mam zajęcia A -> B -> C -> D, gdy zadzwonię do sta rt aktywność E na stosie mam teraz A -> E

Nie wiem czy to dobrze :) ale działa.

+0

OK, więc mam użytkownika ciągle przełączającego się między czynnościami, co oznacza, że ​​mogli przełączyć 15 działań w 20 sekund. Czy to może być przyczyną błędu braku pamięci? Co powinienem zrobić, żeby to naprawić? Dzięki!' –

+0

@RuchirBaronia nie powinien powodować braku pamięci. Prawdopodobnie coś cię trzyma w pamięci :) Sprawdź: http://blogs.innovationm.com/android-out-of-memory-error-causes-solution-and-best-practices/ –

5

To przyzwyczajenie wyczyści twój stos aktywności wstecz.

Nawet po wykonaniu wszystkich powyższych odpowiedzi, po naciśnięciu przycisku Wstecz Pokazano ostatnią aktywność na sekundę przed zamknięciem aplikacji.

To co zrobiłem:

@Override 
public void onBackPressed() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(startMain); 
} 

Teraz moje wyjścia aplikacja na tylnej prasy :) bez żadnych kłopotów.

+0

Należy pamiętać, że wiele zmienił wersję SDK Froyo i Cupcake podczas porównywania odpowiedzi. Innymi słowy, coś, co zadziałało w określony sposób w 2010 r., Może teraz działać inaczej. – Brandon

+0

Tak, masz rację. Będę o tym myślał. Dzięki. – amalBit

+0

ten kod nie działa –

0

Jeśli używamy tego kodu, aby rozpocząć działalność login (A):

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 

Aktywność powinna być w stosie działań, w przeciwnym razie będzie to flagi nie mają żadnego wpływu.

Jeśli użyjemy funkcji finish() w działaniu Login (A), po uruchomieniu działania (B) (aby uniknąć powrotu do A z B), działanie A (Login) nie będzie w stosie. Dokładnie tak samo dzieje się, gdy logowanie ma "noHistory" jako atrybut.

Więc rozwiązaniem dla mnie było to mieszanka innych odpowiedzi:

Kod ten idzie w działalności B, aby uniknąć wrócić do aktywności logowanie:

@Override 
public void onBackPressed() { 
    moveTaskToBack(true); 
    super.onBackPressed(); 
} 

I ten kod przechodzi w aktywność, która wywołać funkcję wylogowania:

public static void logout() { 
    Intent intent = new Intent(activity, LoginMain.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
} 
1

Spróbuj

Intent intent = new Intent(this, MainActivity.class); 
intent.addFlags(
    Intent.FLAG_ACTIVITY_CLEAR_TOP | 
    Intent.FLAG_ACTIVITY_CLEAR_TASK | 
    Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 
Powiązane problemy