Android: Önceki etkinliğe geri dön


524

Android uygulamasında basit bir şey yapmak istiyorum. Önceki bir etkinliğe geri dönmek nasıl mümkün.

Önceki etkinliğe geri dönmek için hangi koda ihtiyacım var?


5
Son açık aktiviteyi takip edin
Vuk

53
Sadece basit çağrı bitirmek (); Şerefe
Nguyen Minh Binh

) (super.finish; Eğer faaliyetin içinden çağırıyorsanız!
happyhardik

5
Burada bir soru: Android, daha az bellek veya diğer sorunlar nedeniyle önceki etkinliği yok ettiyse, bu etkinlik artık backstack'ta olmayacak ve sonra ne olacak?
Güneşli

@Sunny Çöp toplayıcının yığındaki en üst düzey etkinlikle başladığını varsayıyorum. Dolayısıyla, daha önce yapılmış bir etkinlik yoksa, mevcut bir etkinlik de olmayacaktır. Ama bunu varsayıyorum, çünkü bu davranış herhangi bir düzen olmadan bir yığındaki belleği boşaltmaktan daha mantıklı olacaktır. Birisi tam olarak biliyorsa yorumumu düzeltin.
Sedat Kilinc

Yanıtlar:


486

Android etkinlikleri, etkinlik yığınında depolanır. Önceki bir etkinliğe geri dönmek iki anlama gelebilir.

  1. Yeni etkinliği startActivityForResult ile başka bir etkinlikten açtınız . Bu durumda kodunuzdan finishActivity () işlevini çağırabilirsiniz ve sizi önceki etkinliğe geri götürür.

  2. Etkinlik yığınını takip edin. Bir niyetle yeni bir etkinlik başlattığınızda FLAG_ACTIVITY_REORDER_TO_FRONTveya gibi bir hedef bayrağı belirtebilirsiniz FLAG_ACTIVITY_PREVIOUS_IS_TOP. Bunu, uygulamanızdaki etkinlikler arasında karıştırmak için kullanabilirsiniz. Yine de çok fazla kullanmadım. Buradaki bayraklara bir göz atın: http://developer.android.com/reference/android/content/Intent.html

Yorumlarda belirtildiği gibi, etkinlik ile açılırsa, startActivity()o kişi ile kapanabilir finish(). Yukarı düğmesini kullanmak isterseniz onOptionsSelected(MenuItem item), öğe kimliğini yorumlarda belirtilenden android.R.id.homefarklı R.id.homeolarak kontrol ederek yöntemde yakalayabilirsiniz .


237
Veya startActivity () ile etkinlik açtıysanız, finish () ile kapatabilirsiniz (herhangi bir parametreyi
geçmenize


4
@RicNjesh onOptionsItemSelected yönteminizde tıklatılan menü öğesi R.id.home kimliğine sahipse, finish () öğesini çağırın. Geçerli etkinliği kapatır ve sizi startActivity () ile başlatan etkinliğe geri götürür
Anders Ullnæss

Kullanıcının niyetleri aracılığıyla birbiri ardına birçok aktiviteye gitmesini sağlıyorum. Uygulamanın yığın üzerinde çok fazla etkinlikle çökmediğinden emin olmak için herhangi bir şey yapmam gerekir mi? Teşekkürler!
Ruchir Baronia

1
etkinlik 2'yi bitirmeden önce etkinlik 1'in bir noktada ölmeyeceğinden emin misiniz?
user924

225

Deneyin Activity#finish(). Bu, geri düğmesinin varsayılan olarak yaptığı şeydir.


1
neden #? yoksa bir nokta mı?
Nabin

8
Ben demek istediğine inanıyorumthis.finish();
Jens Bodal

69
#Bir göstergesidir finish()Etkinlik sınıfının bir statik olmayan bir yöntemdir. Geçerli bir Java değil, ancak yöntemi nasıl kullanabileceğinizi açıklamaya yardımcı olur.
Bryan Herbst

2
@ Tanis.7x Statik yöntemler için gösterge var mı?
Benten

8
@Benten ., yani:Activity.someStaticMethod()
JonnyReeves

81

Sadece tıklama bitirmek () yazmak . Sizi bir önceki Etkinliğe götürür.


1
Her ne kadar onBackPressed () de çalışıyor olsa da, bu çözümün sadece bir süre için ihtiyacınız olan bir aktiviteden çıkmayı düşünmek için daha iyi olduğunu düşünüyorum ... örneğin benim durumumda OCR tarayıcı. Teşekkürler!
Gene Bo

Bu ihtiyacımı karşılıyor .. Teşekkür ederim.
Roon13

68

Sadece bu

super.onBackPressed();

2
Bu çağrı sadece geçerli etkinliği bitirir, bu nedenle görünür olan son etkinliği gösterir. Ancak, önceden bir etkinlik yoksa veya bu arada yok edilirse, uygulamadan çıkılabilir.
r1k0

22
Bu acayip. Bunu doğrudan çağırmanız gerekmiyor. Bu yaşam döngüsü yöntemlerinden biridir ve android sistemi tarafından çağrılmalıdır.
Dheeraj Bhaskar

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Bu, yığını tutarak önceki bir etkinliğe götürür ve yığından sonraki tüm etkinlikleri temizler.

Örneğin, yığın A-> B-> C-> D ise ve bu bayrakla B'yi başlatırsanız, yığın A-> B olacaktır.


Sonunda bu işe yarıyor. Neyin () çalışmamasına neyin sebep olacağını bulmak isterdim.
Relm

20

Geri düğmesi davranışının kontrolünü ele almak istiyor musunuz? İki yöntemden birini kullanarak geri düğmesini (belirli bir etkinliğe gitmek için) geçersiz kılabilirsiniz.

Android 1.6 ve önceki sürümleri için:

@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);
}

Veya yalnızca Android 2.0 veya üstünü destekliyorsanız:

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

Daha fazla ayrıntı için: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html


19

Geçerli etkinliği bitirmek veya onBackPressed tarafından geri gitmek için bu yöntemi çağırmanız yeterlidir.

finish();

VEYA

onBackPressed();

Kullanıcının niyetleri aracılığıyla birbiri ardına birçok aktiviteye gitmesini sağlıyorum. Uygulamanın yığın üzerinde çok fazla etkinlikle çökmediğinden emin olmak için herhangi bir şey yapmam gerekir mi? Teşekkürler!
Ruchir Baronia

13

gitmek istiyorsanız sadece önceki etkinlik kullanımına gitmek istiyorsanız

finish();

VEYA

onBackPressed();

aşağıdakileri kullanan ikinci bir etkinliğe veya daha altına gitmek istiyorsanız:

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);

1
Finish () ve onBackPressed () her ikisinin de çalıştığını gördüm, ancak en azından uygulamamda, finish () çok yavaş ve onBackPressed () çok daha hızlı. Meraklı.
scrayne

Kullanıcının niyetleri aracılığıyla birbiri ardına birçok aktiviteye gitmesini sağlıyorum. Uygulamanın yığın üzerinde çok fazla etkinlikle çökmediğinden emin olmak için herhangi bir şey yapmam gerekir mi? Teşekkürler!
Ruchir Baronia

13

Bunu onCLick () yönteminize ekleyin, önceki etkinliğinize geri dönecektir

bitiş();

veya Bunu kullanabilirsiniz. Benim için mükemmel çalıştı

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

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

  return super.onOptionsItemSelected(item);
  }

11

AndroidManifest.xml dosyasını etkinlik üst öğesiyle doğru bir şekilde ayarladıysanız, şunları kullanabilirsiniz:

NavUtils.navigateUpFromSameTask(this);

Bu sizin çocuk aktiviteniz.




7

Aynı sorunu var ve

finish();  OR super.onBackPressed();

benim için iyi çalıştı, ikisi de aynı şekilde çalıştı, ama şanssız return


6

İkinci etkinliği niyetini kullanarak başlatın (kullanın startActivityveya startActivityForResultgereksinimlerinize göre). Şimdi kullanıcı geri düğmesine bastığında, üstteki geçerli etkinlik kapatılacak ve önceki etkinlik gösterilecektir.

Şimdi diyelim ki kullanıcı, dil, ülke vb. Gibi bazı ayarları seçmek için iki etkinliğiniz olduğunu ve bunu seçtikten sonra kullanıcı, giriş formuna (örneğin) gitmek için İleri düğmesine tıklar. Oturum açma başarısız olursa, kullanıcı oturum açma etkinliğinde olur, oturum açma başarılı olursa ne olur?

Giriş başarılı olursa, başka bir etkinlik başlatmalısınız. Bu, üçüncü bir etkinliğin başlatılacağı ve halen devam eden iki etkinliğin olduğu anlamına gelir. Bu durumda, kullanmak iyi olacaktır startActivityForResult. Oturum açma başarılı olduğunda, Tamam verilerini ilk etkinliğe geri gönderin ve oturum açma etkinliğini kapatın. Şimdi veri alındığında, üçüncü etkinliği başlatın ve bitirmeyi kullanarak ilk etkinliği kapatın.


Kullanıcının niyetleri aracılığıyla birbiri ardına birçok aktiviteye gitmesini sağlıyorum. Uygulamanın yığın üzerinde çok fazla etkinlikle çökmediğinden emin olmak için herhangi bir şey yapmam gerekir mi? Teşekkürler!
Ruchir Baronia

5

Bunu deneyebilirsiniz:

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

        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

4

finish()Arama etkinliğinde bir kodlamadığınız sürece, varsayılan olarak tüm yeni etkinlikler / hedefler geri / önceki davranışına sahiptir .


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

ve düğme tıklayın istiyorsanız geri dönün

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});

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

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

      return super.onOptionsItemSelected(item);
 }

Bu da hem çalışır deneyin araç çubuğu geri düğmesi olarak donanım geri düğmesi .


2

NavUtils.navigateUpFromSameTask () 'ı öneriyorum, kolay ve çok basit, google geliştiricisinden öğrenebilirsiniz.


1

Önceki etkinliğinize geri dönmek için birkaç durum vardır:

Durum 1: Bir önceki faaliyetinize geri dönmek istiyorsanız ActivityA.java

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

FBHelperActivity.java

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

Durum 2: ActivityA -> FBHelperActivity ----> ActivityA

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.

1

İlk olarak, bir önceki aktiviteye geri dönmek istiyorsanız, aklınızda bulundurmanız gereken şey. O zaman Intent kullanarak başka bir etkinliğe gittiğinizde finish () yöntemini çağırma.

Bundan sonra, mevcut etkinlikten önceki etkinliğe geri dönmenin iki yolu vardır:

Sadece arayın: finish()düğme tıklama dinleyicisi altında veya Sistem geri düğmesini kullanarak geri dönmek için aşağıdaki yöntemi geçersiz kılın:

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

0

Bahsedilen tüm cevapların yanı sıra, hala bunu yapmanın alternatif bir yolu, diyelim ki A ve B sınıfı olmak üzere iki sınıfınız var.

A Sınıfı, onay kutusu seçimi, bazı veriler yazdırılmış ve B sınıfına niyet gibi bazı aktiviteler gerçekleştirdiniz. B Sınıfı, A sınıfına birden fazla değer iletmek ve A sınıfının önceki durumunu korumak istiyorsunuz, kullanabilirsiniz, bu alternatifi deneyin Bunu göstermek için yöntem veya kaynak kodunu indirin

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

veya

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


0

Bunu ilk aktivitede deneyin

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

İkinci etkinliğinizde

@Override
public void onBackPressed() {
    this.finish();
}

çökmeye devam ediyor, veri sanmıyorum
john ktejik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.