Android: Wróć do poprzedniej aktywności

524

Chcę zrobić coś prostego w aplikacji na Androida. Jak można wrócić do poprzedniej aktywności.

Jakiego kodu potrzebuję, aby wrócić do poprzedniej aktywności

Troj
źródło
5
Śledź ostatnią otwartą aktywność
Vuk
53
Po prostu wystarczy wywołać metodę finish (); Na zdrowie
Nguyen Minh Binh,
super.finish (); jeśli dzwonisz do niego z wnętrza działania!
happyhardik,
5
Jedno pytanie tutaj: jeśli Android zniszczył poprzednią aktywność z powodu mniejszej pamięci lub innych problemów, to ta aktywność nie byłaby już dostępna w plecaku, a co wtedy?
Sunny,
@Sunny Zakładam, że śmieciarz zaczyna od najwyższej aktywności na stosie. Więc jeśli nie ma poprzedniej aktywności, nie będzie również bieżącej aktywności. Ale po prostu zakładam, że ponieważ takie zachowanie miałoby większy sens niż zwolnienie pamięci na stosie bez określonej kolejności. Popraw mój komentarz, jeśli ktoś dokładnie to wie.
Sedat Kilinc

Odpowiedzi:

486

Działania na Androida są przechowywane w stosie działań. Powrót do poprzedniej czynności może oznaczać dwie rzeczy.

  1. Otworzyłeś nowe działanie z innego działania za pomocą startActivityForResult . W takim przypadku możesz po prostu wywołać funkcję finishActivity () z kodu, a to zabierze Cię z powrotem do poprzedniej aktywności.

  2. Śledź stos aktywności. Za każdym razem, gdy zaczynasz nowe działanie z zamiarem, możesz określić flagę zamiaru, taką jak FLAG_ACTIVITY_REORDER_TO_FRONTlub FLAG_ACTIVITY_PREVIOUS_IS_TOP. Możesz użyć tego do losowego przełączania działań w aplikacji. Jednak nie korzystałem z nich zbyt często. Spójrz na flagi tutaj: http://developer.android.com/reference/android/content/Intent.html

Jak wspomniano w komentarzach, jeśli czynność jest otwierana za pomocą, startActivity()wówczas można ją zamknąć za pomocą finish(). Jeśli chcesz użyć przycisku W górę, możesz to złapać onOptionsSelected(MenuItem item)metodą sprawdzania ID przedmiotu w android.R.id.homeprzeciwieństwie do tego, R.id.homeco wspomniano w komentarzach.

Abhinav
źródło
237
Lub jeśli otworzyłeś aktywność za pomocą startActivity (), możesz zamknąć za pomocą finish () (nie musisz przekazywać żadnych parametrów)
neworld
3
Czy możesz wyjaśnić, gdzie i jak używasz zakończenia (), więc gdy użytkownik naciśnie przycisk w górę, zabierze go do poprzedniej aktywności
RicNjesh
4
@RicNjesh W metodzie onOptionsItemSelected, jeśli kliknięty menuitem ma identyfikator R.id.home, wywołujemy metodę finish (). Zamknie bieżącą aktywność i zabierze Cię z powrotem do aktywności, która rozpoczęła ją za pomocą startActivity ()
Anders Ullnæss
Nakłaniam użytkownika do wykonywania wielu czynności jedna po drugiej poprzez zamiary. Czy muszę coś zrobić, aby aplikacja nie uległa awarii przy zbyt dużej liczbie działań na stosie? Dzięki!
Ruchir Baronia
1
czy jesteś pewien, że aktywność 1 w pewnym momencie nie umrze, zanim nie skończysz aktywności 2?
user924,
225

Spróbować Activity#finish(). Jest to mniej więcej to, co domyślnie robi przycisk Wstecz.

adamp
źródło
1
dlaczego #? czy to kropka?
Nabin
8
Myślę, że miał na myślithis.finish();
Jens Bodal
69
#Jest to wskaźnik, który finish()jest nie-statyczne metody z klasy aktywności. To nie jest poprawna Java, ale pomaga wyjaśnić, w jaki sposób można użyć tej metody.
Bryan Herbst
2
@ Tanis.7x Czy istnieje wskaźnik dla metod statycznych?
Benten,
8
@Benten to byłoby ., tj .:Activity.someStaticMethod()
JonnyReeves
81

Po prostu napisz po zakończeniu () . Zabierze Cię do poprzedniej aktywności.

Umer Rana
źródło
1
Chociaż onBackPressed () również działa, myślę, że to rozwiązanie jest lepsze do myślenia o wyjściu z działania, którego potrzebujesz tylko na chwilę ... np. Skaner OCR w moim przypadku. Dzięki!
Gene Bo,
To zaspokaja moją potrzebę .. Dziękuję.
Roon13
68

Tylko to

super.onBackPressed();
AtanuCSE
źródło
2
To połączenie właśnie kończy bieżącą aktywność, więc wyświetli ostatnią widoczną aktywność. Jeśli jednak nie ma poprzedniej aktywności lub zostanie ona w międzyczasie zniszczona, aplikacja może wyjść.
r1k0
22
To jest hackish. Nie należy dzwonić bezpośrednio. Jest to jedna z metod cyklu życia i powinna zostać wywołana przez system Android.
Dheeraj Bhaskar
33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

W ten sposób przejdziesz do poprzedniej czynności, zachowując stos i usuwając wszystkie czynności po nim ze stosu.

Na przykład, jeśli stos był A-> B-> C-> D i zaczniesz B z tą flagą, stos będzie A-> B

Dmitrij Ryadnenko
źródło
To działa na moim końcu. Chciałbym dowiedzieć się, co spowodowałoby, że metoda wykończenia () nie działałaby.
Relm
20

Czy chcesz przejąć kontrolę nad zachowaniem przycisku Wstecz? Możesz zastąpić przycisk Wstecz (aby przejść do określonego działania) za pomocą jednej z dwóch metod.

Dla Androida 1.6 i niższych:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

Lub jeśli obsługujesz tylko system Android 2.0 lub nowszy:

@Override
public void onBackPressed() {
    // do something on back.
    return;
}

Aby uzyskać więcej informacji: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html

Bryan Denny
źródło
19

Wystarczy wywołać tę metodę, aby zakończyć bieżącą aktywność lub wrócić przez onBackPressed

finish();

LUB

onBackPressed();
Akshay Paliwal
źródło
Nakłaniam użytkownika do wykonywania wielu czynności jedna po drugiej poprzez zamiary. Czy muszę coś zrobić, aby aplikacja nie uległa awarii przy zbyt dużej liczbie działań na stosie? Dzięki!
Ruchir Baronia,
13

jeśli chcesz przejść tylko do poprzedniej aktywności użyj

finish();

LUB

onBackPressed();

jeśli chcesz przejść do drugiej aktywności lub poniżej, użyj następujących czynności:

intent = new Intent(MyFourthActivity.this , MySecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Bundle is optional
Bundle bundle = new Bundle();
bundle.putString("MyValue1", val1);
intent.putExtras(bundle);
//end Bundle
startActivity(intent);
Ram G.
źródło
1
Przekonałem się, że zarówno wykończenie (), jak i onBackPressed () działają, ale przynajmniej w mojej aplikacji wykończenie () jest bardzo wolne, a onBackPressed () jest znacznie szybszy. Ciekawy.
scrayne
Nakłaniam użytkownika do wykonywania wielu czynności jedna po drugiej poprzez zamiary. Czy muszę coś zrobić, aby aplikacja nie uległa awarii przy zbyt dużej liczbie działań na stosie? Dzięki!
Ruchir Baronia
13

Dodaj to w swojej metodzie onCLick (), wróci do poprzedniej aktywności

koniec();

lub Możesz tego użyć. To działało idealnie dla mnie

 @Override
  public boolean onOptionsItemSelected(MenuItem item) {
  int id = item.getItemId();

      if ( id == android.R.id.home ) {
         finish();
         return true;
       }

  return super.onOptionsItemSelected(item);
  }
Darshuu
źródło
11

Jeśli poprawnie skonfigurowałeś plik AndroidManifest.xml z nadrzędnym działaniem, możesz użyć:

NavUtils.navigateUpFromSameTask(this);

Gdzie jest to aktywność Twojego dziecka.

Thomas Decaux
źródło
8

Spróbuj to zrobić tak, jak musisz nacisnąć przycisk Wstecz

finish();
onBackPressed();
Muhammed Fasil
źródło
7

Możesz bezpośrednio zadzwonić onBackPressedto najłatwiejszy sposób.
Zobacz Wróć do poprzedniej czynności, aby uzyskać szczegółowe informacje

Labeeb Panampullan
źródło
7

Mam ten sam problem i

finish();  OR super.onBackPressed();

działało dobrze dla mnie, oba działały tak samo, ale bez powodzenia return

Bez nazwy
źródło
6

Rozpocznij drugą czynność za pomocą zamiaru (użyj startActivitylub startActivityForResultzgodnie z własnymi wymaganiami). Teraz, gdy użytkownik naciśnie przycisk Wstecz, bieżąca aktywność na górze zostanie zamknięta, a poprzednie zostanie wyświetlone.

Teraz Załóżmy, że masz dwie czynności, jedną do wyboru niektórych ustawień dla użytkownika, takich jak język, kraj itp., A po wybraniu tego użytkownik kliknie przycisk Dalej, aby przejść do formularza logowania (na przykład). Teraz, jeśli logowanie się nie powiedzie, to użytkownik będzie w trakcie logowania, co jeśli logowanie się powiedzie?

Jeśli logowanie się powiedzie, musisz rozpocząć inną aktywność. Oznacza to, że trzecia aktywność zostanie uruchomiona i nadal będą działać dwie czynności. W takim przypadku dobrze będzie użyć startActivityForResult. Po pomyślnym zalogowaniu wyślij dane OK z powrotem do pierwszej aktywności i zamknij aktywność logowania. Teraz, gdy dane zostaną odebrane, rozpocznij trzecie działanie i zamknij pierwsze działanie, używając zakończenia.

Altaf Hussain
źródło
Nakłaniam użytkownika do wykonywania wielu czynności jedna po drugiej poprzez zamiary. Czy muszę coś zrobić, aby aplikacja nie uległa awarii przy zbyt dużej liczbie działań na stosie? Dzięki!
Ruchir Baronia
5

Możesz spróbować:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
nikki
źródło
4

Wszystkie nowe działania / zamiary domyślnie zachowują się wstecz / wcześniej, chyba że zakodowane zostały finish()działania wywołujące.

ameyx
źródło
4
@Override
public void onBackPressed() {
    super.onBackPressed();
}

a jeśli chcesz na przycisk kliknij wróć, a następnie po prostu wstaw

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});
Md Hussain
źródło
3
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();

      if ( id == android.R.id.home ) {
          finish();
          return true;
      }

      return super.onOptionsItemSelected(item);
 }

Wypróbuj to działa zarówno na przycisku Wstecz paska narzędzi, jak i przycisku Wstecz sprzętu .

Puni
źródło
2

Sugeruję NavUtils.navigateUpFromSameTask (), jest to łatwe i bardzo proste, możesz nauczyć się go od programisty Google. Chciałbym ci pomóc!

wuxue
źródło
1

Istnieje kilka przypadków, aby wrócić do poprzedniej aktywności:

Przypadek 1: jeśli chcesz przywrócić wynik do poprzedniej aktywności, ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivityForResult(intent,2);

FBHelperActivity.java

 Intent returnIntent = new Intent();
 setResult(RESULT_OK, returnIntent);
 finish();

Przypadek 2: Aktywność A -> FBHelperActivity ----> Aktywność A.

ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivity(intent);

FBHelperActivity.java

after getting of result call finish();
 By this way your second activity will finish and because 
 you did not call finish() in your first activity then
 automatic first activity is in back ground, will visible.
Gyan Swaroop Awasthi
źródło
1

Po pierwsze, musisz pamiętać, że jeśli chcesz wrócić do poprzedniej czynności. Zatem nie wywołuj metody finish (), gdy przejdziesz do innej aktywności za pomocą Intent.

Następnie masz dwie możliwości powrotu z bieżącej aktywności do poprzedniej aktywności:

Po prostu zadzwoń: finish()pod przyciskiem nasłuchiwania kliknięcia przycisku lub Zastąp następującą metodę cofnięcia za pomocą przycisku powrotu systemu:

@Override
public void onBackPressed() {
    super.onBackPressed();
}
Monir Zzaman
źródło
0

Oprócz wszystkich wspomnianych odpowiedzi, są one nadal alternatywnym sposobem na zrobienie tego, powiedzmy, że masz dwie klasy, klasę A i klasę B.

Do klasy A wykonałeś niektóre czynności, takie jak zaznaczenie pola wyboru, wydrukowałeś pewne dane i zamiar do klasy B. Klasa B, chcesz przekazać wiele wartości do klasy A i zachować poprzedni stan klasy A, możesz użyć, wypróbuj tę alternatywę metoda lub pobierz kod źródłowy, aby to wykazać

http://whats-online.info/science-and-tutorials/125/Android-maintain-the-previous-state-of-activity-on-intent/

lub

http://developer.android.com/reference/android/content/Intent.html

Daniel Nyamasyo
źródło
0

Po prostu spróbuj tego, pierwsza aktywność

Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);

W twojej drugiej działalności

@Override
public void onBackPressed() {
    this.finish();
}
byteC0de
źródło
ciągle się zawiesza, myślę, że dane nie trwają
John KTejik,