Po naciśnięciu przycisku BACK na telefonie chcę uniemożliwić powrót określonej aktywności do poprzedniej.
W szczególności mam ekrany logowania i rejestracji, oba rozpoczynają nowe działanie, nazywane HomeScreen
po pomyślnym zalogowaniu / rejestracji. Po uruchomieniu HomeScreen chcę uniemożliwić użytkownikom powrót do ekranu logowania lub rejestracji po naciśnięciu przycisku BACK.
Próbowałem używać Intent.FLAG_ACTIVITY_NO_HISTORY
, ale ponieważ aplikacja ma integrację z Facebookiem, kiedy używane jest „Logowanie za pomocą Facebooka”, Facebook powinien powrócić do początkowego ekranu logowania, dlatego powinienem przechowywać historię tych działań.
Myślałem o zastąpieniu zachowania przycisku BACK, HomeScreen
aby bezpośrednio zakończyć aplikację, gdy przycisk jest wciśnięty i użyłem
@Override
public void onBackPressed() {
finish();
}
ale to też nie działa.
Odpowiedzi:
Moją sugestią byłoby zakończenie działania, do którego użytkownicy nie chcą wracać. Na przykład w swojej aktywności związanej z logowaniem, zaraz po połączeniu
startActivity
zadzwońfinish()
. Gdy użytkownicy klikną przycisk Wstecz, nie będą mogli przejść do czynności logowania, ponieważ została ona zabita ze stosu.źródło
finish
podczas wspólnego przejścia, możesz uzyskać krwawienie z poprzedniej czynności. na przykład, jeśli maszHomeActivity
->IntermediateActivity
->FinalActivity
i wywołaćfinish()
wIntermediateActivity
natychmiast po uruchomieniuFinalActivity
zobaczyszHomeActivity
za chwilę krótki.Poniższe rozwiązanie może być bardzo przydatne w zwykłym scenariuszu logowania / głównej aktywności lub implementacji ekranu blokowania.
Aby zminimalizować aplikację zamiast wracać do poprzedniej aktywności, możesz zastąpić ją
onBackPressed()
następująco:moveTaskToBack(boolean nonRoot)
pozostawia tylny stos bez zmian, po prostu umieszcza zadanie (wszystkie działania) w tle. To samo, jakby użytkownik nacisnął przycisk Home .Parametr
boolean nonRoot
- Jeśli false, działa to tylko wtedy, gdy działanie jest głównym zadaniem; jeśli true, będzie działać dla dowolnej aktywności w zadaniu.źródło
Nie jestem pewien, czego dokładnie chcesz, ale wygląda na to, że powinno to być możliwe, a także brzmi, jakbyś już był na dobrej drodze.
Oto kilka linków, które mogą pomóc:
Wyłącz przycisk Wstecz w Androidzie
Jak mogę wyłączyć „powrót” do niektórych działań?
źródło
System.exit(0)
się nazywa (wiem, że nie jest to najlepsza praktyka, ale chciałem tylko podać przykład).W twoim przypadku istnieją dwa rozwiązania: działanie A rozpoczyna działanie B, ale nie chcesz wracać do działania A w działaniu B.
1. Usunięto poprzednie działanie A z tylnego stosu.
2. Wyłączone działanie przycisku cofania w działaniu B.
Istnieją dwa sposoby zapobiegania zdarzeniu wstecznemu, jak poniżej:
1) Poleć podejście
2) Zastąp metodę onKeyDown
Mam nadzieję, że jest to przydatne, ale nadal zależy od twoich sytuacji.
źródło
finish()
. Niepotrzebnie przemyślane za pomocąnohistory
atrybutu, flag intencji, tagów manifestu aktywności rodzica itp.! Głupie, dzięki za odpowiedź!Ponieważ zaproponowano już wiele świetnych rozwiązań, źle postaram się podać bardziej szczegółowe wyjaśnienia.
Usuń poprzednią aktywność z Backstack. Prosty
Połączenie
finish()
MetodaNormalny przepływ:
Wszystkie działania są przechowywane w stosie znanym jako Backstack.
Kiedy zaczynasz nową aktywność (
startActivity(...)
), nowa aktywność jest wypychana na górę stosu, a po naciśnięciu przycisku Wstecz aktywność jest wyskakująca ze stosu.Jednym z najważniejszych zadań należy zauważyć, że gdy przycisk jest wciśnięty, a następnie z powrotem
finish();
metoda nazywa się wewnętrznie. Jest to domyślne zachowanie metody onBackPressed ().Więc jeśli chcesz pominąć Aktywność B?
Po prostu dodaj
finish();
metodę po swoimstartActvity(...)
w ćwiczeniu Bźródło
finish()
daje metodę zamknięcia bieżącej działalności, a nie całej aplikacji. I lepiej nie próbuj szukać metod zabijania aplikacji. Mała rada.Czy próbowałeś koniunktury
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY
? Pamiętaj, aby używać tych flag podczasIntent
rozpoczynania aktywności!źródło
FLAG_ACTIVITY_NO_HISTORY
uniemożliwia mojemu LoginScreen przechwytywanie oddzwaniania Facebooka, gdy używane jest logowanie przez Facebook. Ponieważ gdy fokus zniknie z ekranu logowania, nie można go wznowić (ponieważ nie ma historii). Ale nie próbowałem tegoIntent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
, sprawdzę to, dzięki!finish()
metodzie, nie wiedziałem o tym.Umieść
finish()
zaraz poźródło
Odpowiedź paulsm4 jest poprawna. Jeśli
onBackPressed()
po prostu wrócisz, spowoduje to wyłączenie przycisku Wstecz. Jednak myślę, że lepszym podejściem, biorąc pod uwagę twój przypadek użycia, jest odwrócenie logiki aktywności, tj. Uczynienie aktywności domowej główną, sprawdzenie, czy użytkownik jest tam zalogowany, jeśli nie, rozpoczęcie aktywności logowania. Powodem jest to, że jeśli zastąpisz przycisk Wstecz w głównej aktywności, większość użytkowników będzie zdezorientowana, gdy go odepchnie, a aplikacja nic nie zrobi.źródło
Jeśli nie chcesz wracać do wszystkich działań w aplikacji, możesz użyć
Dowiedz się więcej tutaj: http://developer.android.com/guide/topics/manifest/activity-element.html
źródło
Ta metoda działa dobrze
źródło
Po prostu zastąp metodę onKeyDown i sprawdź, czy został naciśnięty przycisk Wstecz.
źródło
Po utworzeniu
onBackPressed()
wystarczy usunąćsuper.onBackPressed();
i to powinno działaćźródło
Położyć
natychmiast po ActivityStart, aby zatrzymać aktywność uniemożliwiającą powrót do niej. Następnie dodaj
do aktywności, którą zaczynasz.
źródło