W Androidzie mam pewne działania, powiedzmy A, B, C.
W A używam tego kodu, aby otworzyć B:
Intent intent = new Intent(this, B.class);
startActivity(intent);
W B używam tego kodu, aby otworzyć C:
Intent intent = new Intent(this, C.class);
startActivity(intent);
Gdy użytkownik stuknie przycisk w C, chcę wrócić do A i wyczyścić tylny stos (zamknąć zarówno B, jak i C). Więc kiedy użytkownik użyje przycisku Wstecz B i C się nie pokaże, próbowałem:
Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Ale B i C nadal się wyświetlają, jeśli użyję przycisku Wstecz, gdy wrócę do aktywności A. Jak mogę tego uniknąć?
źródło
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
źródło
CLEAR_TOP
flagi - ta kombinacja jest TYLKO tą, która całkowicie wyczyściła cały stos i uczyniła nową aktywność jedyną w aplikacji. Dziękuję Ci!Co z dodawaniem pliku manifestu dla powiązanej aktywności:
do definicji aktywności B i C? Nie zostaną dodane do backstacka. Nie jestem pewien, czy tego właśnie chcesz.
źródło
Długo mi to przeszkadza. W końcu to wypracowałem:
Fragmentem użyj:
W Aktywności użyj (dodaj jeszcze jedną flagę zamiaru w
Intent.FLAG_ACTIVITY_CLEAR_TASK
porównaniu do fragmentu):źródło
android:launchMode="singleTop"
do elementu aktywności w manifeście dla działania Aintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
iintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
podczas rozpoczynania działania AOznacza to, że po uruchomieniu działania A wszystkie zadania nad nim są usuwane, dzięki czemu A jest na górze. Nowy tylny stos jest tworzony z A w katalogu głównym, a użycie
singleTop
zapewnia, że uruchomisz A tylko raz (ponieważ A jest teraz na wierzchu z powodu..._CLEAR_TOP
).źródło
Począwszy od API 16 (Jelly Bean), możesz po prostu zadzwonić
finishAffinity()
.Teraz możesz także dzwonić
ActivityCompat.finishAffinity(Activity activity)
za pomocą biblioteki kompatybilności.Pamiętaj, aby ustawić taskAffinity w manifeście na nazwę pakietu unikalną dla tej grupy działań.
Zobacz więcej informacji:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29
źródło
Spróbuj użyć
i nie
źródło
Jeśli twoja aplikacja ma minimalną wersję SDK 16, możesz użyć finishAffinity ()
Zakończ to działanie, a także wszystkie działania bezpośrednio pod nim w bieżącym zadaniu, które mają to samo powinowactwo.
Dla mnie to działa. Na ekranie Top Payment usuń wszystkie aktywacje back-stack,
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
źródło
Zgodnie z Wakka w Usuwanie aktywności ze stosu historii ...
Dodaj
android:noHistory="true"
atrybut do swojego<activity>
wAndroidManifest.xml
następujący sposób:źródło
Do przyszłych badań wypróbuj ten kod.
źródło
Użyj finishAffinity (); w zadaniu C podczas uruchamiania zadania A w celu wyczyszczenia działań backstack.
źródło
Użyj tego kodu, aby rozpocząć nowe działanie i zamknąć lub zniszczyć wszystkie inne stosy działań lub stosy wsteczne.
źródło
źródło
Znalazłem interesujące rozwiązanie, które może pomóc. Zrobiłem to w mojej
onBackPressed()
metodzie.FinishAffinity
usuwa połączenie istniejącej aktywności ze stosem. A potem wykończenie pomaga wyjść z tej aktywności. Które ostatecznie zamkną aplikację.źródło
Znalazłem tutaj odpowiedzi trochę mylące, ponieważ kod w pierwotnym pytaniu wydaje się działać dobrze dla mnie?
Ponieważ A jest działaniem głównym, rozpoczęcie od B lub C tylko z FLAG_ACTIVITY_CLEAR_TOP usuwa B i C z tylnego stosu.
źródło
W kotlin jest prawie tak samo jak java. Tylko | symbol jest zastąpiony przez lub tekst. Więc jest napisane jak
źródło
Wypróbowałem wszystkie rozwiązania i żadne nie działało indywidualnie dla mnie. Moje rozwiązanie to:
Zadeklaruj
Activity A
jakoSingleTop
za pomocą[android:launchMode="singleTop"]
manifestu systemu Android.Teraz dodaj następujące flagi podczas uruchamiania
A
z dowolnego miejsca. Wyczyści stos.źródło
Intent.FLAG_ACTIVITY_CLEAR_TOP
nie będzie działać w tym przypadku. Proszę użyć(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
Aby uzyskać więcej informacji, zapoznaj się z tą dokumentacją.
źródło
Wydaje mi się, że musisz zacząć
Activity C
odActivity B
użyciastartActivityForResult()
. Po kliknięciu w przyciskActivity C
, rozmowysetResult(RESULT_OK)
ifinish()
takActivity C
się skończyło. WewnątrzActivity B
możesz uzyskaćonActivityResult()
odpowiedź, wzywającfinish()
się, a następnie zostaniesz zabrany z powrotem doActivity A
.źródło
logout.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
źródło
Można użyć tego przykładu, aby połączyć się
Activity A
zActivity C
Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);
źródło
dla mnie dodanie
Intent.FLAG_ACTIVITY_CLEAR_TASK
rozwiązało problemźródło
Zaawansowany, wielokrotnego użytku Kotlin:
Możesz ustawić flagę bezpośrednio za pomocą metody setter. W Kotlin
or
jest zamiennikiem Java bitowej lub|
.Jeśli użyjesz tego więcej niż raz, utwórz funkcję rozszerzenia Intent
Następnie możesz bezpośrednio wywołać tę funkcję przed rozpoczęciem zamiaru
Jeśli potrzebujesz opcji dodania dodatkowych flag w innych sytuacjach, dodaj opcjonalny parametr do funkcji rozszerzenia.
źródło
Oprócz tego
FLAG_ACTIVITY_CLEAR_TOP
możesz spróbować dodaćIntent.FLAG_ACTIVITY_SINGLE_TOP
:intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
źródło
Podany kod działa poprawnie. Próbowałem w przykładzie cyklu życia aplikacji.
Nie mam B i C na ostatnim stosie po rozpoczęciu aktywności A z flagą, FLAG_ACTIVITY_CLEAR_TOP
źródło
zadzwoniłem
activity_name.this.finish()
po rozpoczęciu nowego zamiaru i zadziałało to dla mnie.Ale to nie zadziała dla mnie ... Nie sugeruję użycia tego rozwiązania, ale jeśli ustawienie flagi nie zadziała, możesz spróbować. Ale nadal polecam, nie używaj go
źródło
Dodaj w zamian BEZ flagi historii.
W ćwiczeniu B rozpocznij działanie C jak poniżej >>>>>>
źródło
W manifestie
i
źródło
Dodaj to do swojego
Activity B
iActivity C
lub
Override
onBackPressed
funkcję, aby uniknąć naciśnięcia wstecz za pomocąreturn
.źródło
Skorzystaj z metody setFlags (), aby wyczyścić tylną stronę otwartą wszystkie działania zamknij i uruchom swoją aktywność
źródło