Android: Kembali ke aktivitas sebelumnya


525

Saya ingin melakukan sesuatu yang sederhana di aplikasi android. Bagaimana mungkin kembali ke aktivitas sebelumnya.

Kode apa yang saya perlukan untuk kembali ke aktivitas sebelumnya


5
Pantau aktivitas terbuka terakhir
Vuk

54
Anda cukup menyelesaikan panggilan sederhana (); Cheers
Nguyen Minh Binh

super.finish (); jika Anda memanggilnya dari dalam aktivitas!
happyhardik

5
Satu pertanyaan di sini: Jika android telah menghancurkan aktivitas sebelumnya karena kurang memori atau masalah lain, maka aktivitas itu tidak lagi ada di backstack dan lalu apa yang terjadi?
Sunny

@Sunny Saya berasumsi bahwa pemulung mulai dengan aktivitas paling banyak di tumpukan. Jadi jika tidak ada aktivitas sebelumnya, juga tidak akan ada aktivitas saat ini. Tapi saya hanya berasumsi bahwa karena perilaku itu akan lebih masuk akal daripada membebaskan memori dalam tumpukan tanpa urutan tertentu. Perbaiki komentar saya, jika seseorang tahu persisnya.
Sedat Kilinc

Jawaban:


486

Aktivitas Android disimpan dalam tumpukan aktivitas. Kembali ke aktivitas sebelumnya bisa berarti dua hal.

  1. Anda membuka aktivitas baru dari aktivitas lain dengan startActivityForResult . Dalam hal ini Anda bisa memanggil fungsi finishActivity () dari kode Anda dan itu akan membawa Anda kembali ke aktivitas sebelumnya.

  2. Melacak tumpukan aktivitas. Setiap kali Anda memulai aktivitas baru dengan maksud, Anda dapat menentukan bendera maksud seperti FLAG_ACTIVITY_REORDER_TO_FRONTatau FLAG_ACTIVITY_PREVIOUS_IS_TOP. Anda dapat menggunakan ini untuk mengacak antara aktivitas dalam aplikasi Anda. Belum banyak menggunakannya. Lihat bendera di sini: http://developer.android.com/reference/android/content/Intent.html

Seperti disebutkan dalam komentar, jika aktivitas dibuka startActivity()maka seseorang dapat menutupnya finish(). Jika Anda ingin menggunakan tombol Up Anda dapat menangkap bahwa dalam onOptionsSelected(MenuItem item)metode dengan memeriksa ID item terhadap android.R.id.hometidak seperti R.id.homeyang disebutkan di komentar.


237
Atau jika Anda membuka aktivitas dengan startActivity (), Anda dapat menutup dengan selesai () (tidak perlu melewati parameter apa pun)
neworld

3
Bisakah Anda mengklarifikasi di mana dan bagaimana Anda menggunakan finish () sehingga ketika pengguna menekan tombol atas itu membawa mereka ke aktivitas sebelumnya
RicNjesh

4
@RicNjesh Dalam metode onOptionsItemSelected Anda jika menuitem yang diklik memiliki id R.id.home kemudian panggil finish (). Ini akan menutup aktivitas saat ini dan membawa Anda kembali ke aktivitas yang memulai dengan startActivity ()
Anders Ullnæss

Saya meminta pengguna untuk melakukan banyak aktivitas satu demi satu melalui niat. Apakah saya perlu melakukan sesuatu untuk memastikan aplikasi tidak macet dengan terlalu banyak kegiatan di stack? Terima kasih!
Ruchir Baronia

1
apakah Anda yakin aktivitas 1 tidak akan mati sebelum Anda menyelesaikan aktivitas 2?
user924

225

Coba Activity#finish(). Ini kurang lebih apa yang dilakukan tombol kembali secara default.


1
mengapa #? atau titik?
Nabin

8
Saya percaya maksudnyathis.finish();
Jens Bodal

69
The #merupakan indikator bahwa finish()adalah metode non-statis dari kelas Activity. Ini bukan Java yang valid, tetapi ini membantu menjelaskan bagaimana seseorang dapat menggunakan metode ini.
Bryan Herbst

2
@ Tanis.7x Apakah ada dan indikator untuk metode statis?
Benten

8
@Benten itu ., yaitu:Activity.someStaticMethod()
JonnyReeves

81

Cukup tulis pada klik selesai () . Ini akan membawa Anda ke Aktivitas sebelumnya.


1
Meskipun onBackPressed () berfungsi dengan baik, saya pikir solusi ini lebih baik untuk berpikir tentang keluar dari aktivitas yang Anda butuhkan hanya untuk sedikit .. misalnya pemindai OCR dalam kasus saya. Terima kasih!
Gene Bo

Ini memuaskan kebutuhan saya..Terima kasih.
Roon13

68

Hanya ini

super.onBackPressed();

2
Panggilan ini baru saja menyelesaikan aktivitas saat ini, sehingga akan menunjukkan aktivitas terakhir yang terlihat. Namun jika, tidak ada aktivitas sebelumnya atau dihancurkan sementara itu, aplikasi dapat keluar.
r1k0

22
Ini adalah retas. Anda tidak seharusnya memanggil ini secara langsung. Ini adalah salah satu metode siklus hidup dan harus dipanggil oleh sistem android.
Dheeraj Bhaskar

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Ini akan membawa Anda ke aktivitas sebelumnya dengan menyimpan tumpukannya dan menghapus semua aktivitas setelah tumpukan.

Misalnya, jika tumpukan adalah A-> B-> C-> D dan Anda mulai B dengan flag ini, tumpukan akan menjadi A-> B


Inilah yang berhasil pada saya. Akan sangat senang mengetahui apa yang akan menyebabkan selesai () tidak bekerja.
Relm

20

Apakah Anda ingin mengendalikan perilaku tombol kembali? Anda dapat mengganti tombol kembali (untuk pergi ke aktivitas tertentu) melalui salah satu dari dua metode.

Untuk Android 1.6 dan di bawah ini:

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

Atau jika Anda hanya mendukung Android 2.0 atau lebih tinggi:

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

Untuk detail lebih lanjut: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html


19

Cukup panggil metode ini untuk menyelesaikan aktivitas saat ini atau untuk kembali dengan onBackPressed

finish();

ATAU

onBackPressed();

Saya meminta pengguna untuk melakukan banyak aktivitas satu demi satu melalui niat. Apakah saya perlu melakukan sesuatu untuk memastikan aplikasi tidak macet dengan terlalu banyak kegiatan di stack? Terima kasih!
Ruchir Baronia

13

jika Anda ingin pergi ke hanya ingin pergi menggunakan aktivitas sebelumnya

finish();

ATAU

onBackPressed();

jika Anda ingin pergi ke aktivitas kedua atau di bawah yang menggunakan berikut:

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
Saya menemukan bahwa finish () dan onBackPressed () keduanya berfungsi, tetapi, dalam aplikasi saya setidaknya, finish () sangat lambat dan onBackPressed () jauh lebih cepat. Ingin tahu.
scrayne

Saya meminta pengguna untuk melakukan banyak aktivitas satu demi satu melalui niat. Apakah saya perlu melakukan sesuatu untuk memastikan aplikasi tidak macet dengan terlalu banyak kegiatan di stack? Terima kasih!
Ruchir Baronia

13

Tambahkan ini dalam metode onCLick () Anda, itu akan kembali ke aktivitas Anda sebelumnya

selesai();

atau Anda bisa menggunakan ini. Ini bekerja dengan baik untuk saya

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

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

  return super.onOptionsItemSelected(item);
  }

11

Jika Anda telah menyiapkan file AndroidManifest.xml dengan induk aktivitas dengan benar, Anda dapat menggunakan:

NavUtils.navigateUpFromSameTask(this);

Di mana ini adalah aktivitas anak Anda.


8

Coba ini bertindak karena Anda harus menekan tombol kembali

finish();
onBackPressed();


7

Punya masalah yang sama dan

finish();  OR super.onBackPressed();

bekerja dengan baik untuk saya, keduanya bekerja sama, tetapi tidak berhasil return


6

Mulai aktivitas kedua menggunakan niat (baik menggunakan startActivityatau startActivityForResultsesuai dengan kebutuhan Anda). Sekarang ketika pengguna menekan tombol kembali, aktivitas saat ini di atas akan ditutup dan sebelumnya akan ditampilkan.

Sekarang Katakanlah Anda memiliki dua kegiatan, satu untuk memilih beberapa pengaturan untuk pengguna, seperti bahasa, negara, dll, dan setelah memilihnya, pengguna mengklik tombol Next untuk masuk ke formulir login (misalnya). Sekarang jika login tidak berhasil, maka pengguna akan berada di aktivitas login, bagaimana jika login berhasil?

Jika login berhasil, maka Anda harus memulai aktivitas lain. Ini berarti kegiatan ketiga akan dimulai, dan masih ada dua kegiatan yang berjalan. Dalam hal ini, itu akan baik untuk digunakan startActivityForResult. Ketika login berhasil, kirim kembali data OK ke aktivitas pertama dan tutup aktivitas login. Sekarang ketika data diterima, maka mulailah aktivitas ketiga dan tutup aktivitas pertama dengan menggunakan selesai.


Saya meminta pengguna untuk melakukan banyak aktivitas satu demi satu melalui niat. Apakah saya perlu melakukan sesuatu untuk memastikan aplikasi tidak macet dengan terlalu banyak kegiatan di stack? Terima kasih!
Ruchir Baronia

5

Anda dapat mencoba ini:

@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

Semua aktivitas / niat baru secara default memiliki kembali / perilaku sebelumnya, kecuali jika Anda telah memberi kode finish()pada aktivitas panggilan.


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

dan jika Anda ingin tombol klik kembali maka cukup masukkan

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

Coba ini berfungsi baik pada tombol kembali toolbar sebagai tombol kembali hardware .


2

Saya menyarankan NavUtils.navigateUpFromSameTask (), mudah dan sangat sederhana, Anda dapat mempelajarinya dari pengembang google. Berharap saya bisa membantu Anda!


1

Ada beberapa kasus untuk kembali ke aktivitas Anda sebelumnya:

Kasus 1: jika Anda ingin mengembalikan hasil ke aktivitas Anda sebelumnya maka ActivityA.java

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

FBHelperActivity.java

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

Kasus 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

Pertama, hal yang perlu Anda ingat, jika ingin kembali ke aktivitas sebelumnya. Maka jangan panggil metode finish () ketika pergi ke aktivitas lain menggunakan Intent.

Setelah itu Anda memiliki dua cara untuk kembali dari aktivitas saat ini ke aktivitas sebelumnya:

Cukup panggil: di finish()bawah pendengar klik tombol, Atau Override metode berikut untuk kembali menggunakan tombol kembali sistem:

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

0

Selain semua jawaban yang disebutkan, mereka masih merupakan cara alternatif untuk melakukan ini, katakanlah Anda memiliki dua kelas, kelas A dan kelas B.

Kelas A Anda telah membuat beberapa aktivitas seperti kotak centang pilih, mencetak beberapa data dan bermaksud ke kelas B. Kelas B, Anda ingin meneruskan beberapa nilai ke kelas A dan mempertahankan status sebelumnya dari kelas A, Anda dapat menggunakan, coba alternatif ini metode atau unduh kode sumber untuk menunjukkan ini

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

atau

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


0

Coba saja ini, aktivitas pertama

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

Dalam aktivitas kedua Anda

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

terus menerjang, data tidak bertahan saya pikir
john ktejik
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.