Cara menutup aktivitas dan kembali ke aktivitas sebelumnya di android

144

Saya memiliki aktivitas utama, bahwa ketika saya mengklik tombol, memulai aktivitas baru, saya menggunakan kode berikut untuk melakukannya:

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

Kode di atas dijalankan dari aktivitas utama.

Sekarang dalam aktivitas baru saya yang disebut dengan aktivitas utama, saya memiliki tombol kembali. Ketika saya mengklik tombol kembali ini saya ingin aktivitas baru saya ditutup dan itu harus kembali ke aktivitas utama yang asli.

Saya telah mencoba menelepon super.finish()dan adil finish() (dari aktivitas baru) tetapi ini kemudian menutup seluruh aplikasi saya (termasuk aktivitas utama saya).

Bagaimana saya bisa menutup aktivitas yang saat ini sedang dalam fokus, dan kemudian kembali ke aktivitas utama?

Diedit

Fakta bahwa tombol kembali ponsel saya juga menutup seluruh aplikasi saya, membuat saya berpikir bahwa saya telah memulai aktivitas kedua secara salah?


OK saya sudah mencari,

Saya membuat Aktivitas Pengaturan yang menggunakan kode manifes yang sama dan kode yang sama untuk Memulai aktivitas.

Untuk aktivitas Pengaturan ketika saya menekan tombol kembali, itu kembali ke aktivitas Utama.

Dengan aktivitas yang disebutkan di atas dalam pertanyaan utama, ia hanya keluar dari seluruh aplikasi saya.

Jadi masalahnya bukan pada kode untuk menyelesaikan aktivitas tetapi aktivitas itu sendiri.

Zapnologica
sumber
4
Anda bahkan tidak perlu tombol kembali, biarkan saja pengguna menggunakan tombol kembali ponsel dan Anda tidak perlu melakukan apa-apa.
Hoan Nguyen
Tombol kembali ponsel menutup aplikasi masuk, bukan hanya aktivitas sekunder saya. Saya tidak ingin menutup kegiatan utama.
Zapnologica
1
Tombol 'kembali' seharusnya tidak melakukan itu - dapatkah Anda menampilkan lebih banyak kode Anda?
peejaybee
Menanggapi hasil edit Anda, aktivitas sekunder terlihat bagus dari apa yang Anda poskan. Saya pikir TGMCians mungkin memiliki jawaban yang tepat dan Anda menyelidiki manifes Anda.
peejaybee
lihat jawaban ini saya pikir ini akan membantu Anda
Muhammad Helmi

Jawaban:

201

Saya pikir Anda memanggil finish()metode MainActivitysebelum memulai SettingsActivity.

Skenario yang telah Anda gambarkan akan terjadi dalam dua cara berikut:

ANTARA

Anda telah mengatur android:noHistory = "true"untuk MainActivitydi dalam AndroidManifest.xmlyang menyebabkan MainActivityuntuk finishsecara otomatis pada menekan tombol kembali.

ATAU

Sebelum beralih ke 'SettingsActivity' Anda, Anda telah disebut finish()di Anda MainActivity, yang membunuh itu. Ketika Anda menekan tombol kembali, karena tidak ada aktivitas lain yang diatur dalam tumpukan untuk pop, itu kembali ke layar utama.

Ajay S
sumber
Itu akan menjelaskan mengapa tombol 'kembali' ponsel juga menolak aktivitas utama.
peejaybee
Saat debugging, saya perhatikan eksekusi berlanjut setelah selesai (), jadi disarankan untuk mengembalikannya.
hingga
Bukankah alasan ketiga dalam jawaban ini hanyalah pengulangan dari yang pertama?
Pang
60

Anda dapat kembali ke aktivitas sebelumnya dengan hanya memanggil selesai () di aktivitas yang sedang Anda jalani. Catat kode apa pun setelah panggilan selesai () akan dijalankan - Anda bisa melakukan pengembalian setelah menelepon selesai () untuk memperbaikinya.

Jika Anda ingin mengembalikan hasil ke aktivitas satu maka saat memulai aktivitas kedua Anda perlu:

startActivityForResults(myIntent, MY_REQUEST_CODE);

Di dalam aktivitas yang dipanggil, Anda bisa mendapatkan Intent dari parameter onCreate () atau digunakan

getIntent();

Untuk mengatur mengembalikan hasil ke aktivitas satu maka dalam aktivitas dua lakukan

setResult(Activity.RESULT_OK, MyIntentToReturn);

Jika Anda tidak memiliki niat untuk kembali, katakan saja

setResult(Activity.RESULT_OK);

Jika aktivitas memiliki hasil yang buruk, Anda dapat menggunakan Activity.RESULT_CANCELED (ini digunakan secara default). Kemudian dalam aktivitas yang Anda lakukan

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

Untuk menyelesaikan aktivitas dua gunakan metode yang sama dengan finish () seperti yang dijelaskan di atas dengan hasil Anda sudah ditetapkan.

Aku
sumber
1
"Catat kode apa pun setelah panggilan selesai () akan dijalankan - Anda bisa melakukan pengembalian setelah menelepon selesai () untuk memperbaikinya" Saya pikir 'memperbaiki' adalah pilihan kata yang buruk di sini. Ini lebih seperti Anda menghindari eksekusi dari baris berikut (tidak memperbaiki).
Lo-Tan
14

Ketika Anda mengklik tombol Anda, Anda dapat membuatnya memanggil:

super.onBackPressed();
Zabador
sumber
11

jika Anda menggunakan fragmen Anda harus menggunakan

getActivity().onBackPressed();

jika Anda menggunakan satu aktivitas yang dapat Anda gunakan

finish();
Osama Ibrahim
sumber
7

coba kode ini alih-alih finish:

onBackPressed();

Sanaz Afzali
sumber
2
Berfungsi baik untuk kembali dari ActivityB ke ActivityA. Untuk fragmen dan aktivitas tunggal dapat menggunakan jawaban @Osama Ibrahim.
Eftekhari
4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});
KEYSAN
sumber
4

Ini menutup seluruh aplikasi:

this.finish();
Logar314159
sumber
Ini menutup seluruh aplikasi sebagaimana dinyatakan dalam pertanyaan, bukan hanya aktivitas saat ini, Seperti halnya tombol kembali ponsel?
Zapnologica
Bagaimana cara saya mendapatkan aktivitas sebelumnya dari aktivitas Kamera.
coderpc
2
Tidak, tidak. Itu hanya menutup aktivitas saat ini. Lihat: developer.android.com/reference/android/app/…
Firzen
4

Saya percaya aktivitas kedua Anda mungkin tidak terkait dengan aktivitas utama Anda sebagai aktivitas anak-anak. Periksa AndroidManifest.xmlfile Anda dan lihat apakah <activity>entri untuk aktivitas anak Anda menyertakan android:parentActivityNameatribut. Seharusnya terlihat seperti ini:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...
Trevor
sumber
1

Hanya saja jangan panggil finish()Anda MainActivitymaka ini menghilangkan kebutuhan untuk Mengganti Anda onBackPressed()di Anda SecondActivitykecuali Anda melakukan hal-hal lain dalam fungsi itu. Jika anda merasa "perlu" untuk tombol kembali ini maka Anda hanya dapat memanggil finish()di SecondActivitydan yang akan membawa Anda ke Anda MainActivityselama Anda belum disebut finish()di atasnya

codeMagic
sumber
Saya mencoba rute ini, tetapi saya memiliki sekitar 10 layar secara berurutan yang menggunakan PNG resolusi tinggi. Masalahnya adalah, pada sekitar layar 7, perangkat kehabisan memori karena semua aktivitas di back-stack. Saya memutuskan untuk memanggil selesai pada setiap kegiatan, dan ini memperbaiki masalah dengan mengizinkan pengumpulan sampah, tetapi sekarang perilaku kembali perlu dikodekan secara manual karena tumpukan-kembali sekarang kosong. Apakah Anda mengalami masalah ini atau mengetahui mekanisme apa pun di Android untuk mengatasi ini?
Lo-Tan
Apa yang Anda ingin tombol kembali lakukan? Kembali ke apa pun yang sebelumnya Activityatau selalu kembali ke MainActivity? Juga, jika Anda kehabisan memori dengan Bitmapsmaka Anda harus membaca bagian Dokumen ini . Itu membantu saya
codeMagic
@ Lo-Tan jika Anda ingin kembali ke aktivitas sebelumnya maka saya pikir Anda perlu mengetahui manajemen memori untuk gambar Anda dan tidak menyelesaikan aktivitas (mungkin dengan tautan yang saya berikan). Jika tidak, Anda harus membuat ulang instance baru dari aktivitas dan mencoba mencari tahu mana yang akan kembali
codeMagic
Saya ingin tombol kembali untuk hanya pergi ke layar sebelumnya. Ini adalah serangkaian layar tutorial, pada dasarnya, dan pengguna dapat maju / mundur. Setiap layar dirancang dan menggunakan banyak png - terkadang png yang menggunakan sebagian besar layar (bukan hanya thumbnail kecil) sehingga menyedot banyak memori untuk setiap layar.
Lo-Tan
@ Lo-Tan Saya pikir Anda ingin mengganti metode onBackPressed () dan kemudian hanya secara manual membuat aktivitas yang ingin Anda tuju. Anda kemudian dapat mengakhiri yang Anda aktifkan dan memulai yang sebelumnya.
Zapnologica
1

Saya tidak tahu apakah ini berguna atau tidak, tetapi saya sedang berjuang dengan masalah yang sama dan saya menemukan cara yang cukup mudah, hanya dengan variabel boolean global dan tindakan onResume (). Dalam kasus saya, Aktivitas C saya jika diklik pada tombol tertentu itu akan memicu finish () dari Kegiatan B!

Activity_A -> Activity_B -> Activity_C

Activity_A (terbuka secara normal Activity_B)

Activity_B (pada beberapa tombol klik buka Activity_C):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

Jadi, setiap kali saya mengklik tombol pada Kegiatan C itu akan melakukan fungsi "onResume ()" dari Kegiatan B dan kembali ke Kegiatan A.

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

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

        return super.onOptionsItemSelected(item);
    }

Cobalah ini berfungsi baik pada tombol kembali bilah alat sebagai tombol kembali perangkat keras .

Puni
sumber
Yang ini berhasil untuk saya. Saya juga punya MainActivity dan SettingsActivity dengan android:parentActivityName=".MainActivity"untuk yang kedua. Kode ini menangani tombol Home / Back di toolbat dan baru saja menyelesaikan aktivitas saat ini kembali ke yang sebelumnya di stack. Terima kasih.
mortalis
1

Selesai menutup seluruh aplikasi, ini adalah sesuatu yang saya benci dalam pengembangan Android tidak selesai itu baik-baik saja tetapi mereka tidak mengikuti sintaks ok yang mereka miliki

startActivity(intent)

Kenapa tidak

closeAktivitas (niat)?

Kent Hansen
sumber
1
Apakah ini menjawab pertanyaan? Atau ini hanya saran untuk dicoba? Dalam kedua kasus, kata-kata kasar tidak perlu dan kemungkinan tidak diterima pada SO
Gilles Gouaillardet
1

Kami menghadapi situasi yang sangat mirip.

Kegiatan 1 (Pembukaan) -> Kegiatan 2 (Pratinjau) -> Kegiatan 3 (Detail)

Respons "on back press" salah

  • Perangkat kembali menekan pada Kegiatan 3 juga akan menutup Kegiatan 2.

Saya telah memeriksa semua jawaban yang diposting di atas dan tidak ada satupun yang berfungsi. Sintaks Java untuk transisi antara Aktivitas 2 dan Kegiatan 3 ditinjau benar.

Baru dari pengkodean saat memanggil aplikasi pihak ke-3. oleh suatu Aktivitas. Kami memutuskan untuk menyelidiki sudut konfigurasi - pada akhirnya memungkinkan kami untuk mengidentifikasi akar penyebab masalah.

Cakupan : Konfigurasi Aktivitas 2 (penelepon).

Penyebab Root :

android:launchMode="singleInstance"

Solusi :

android:launchMode="singleTask"

Rupanya pada masalah "on back press" ini singleInstance mempertimbangkan Kegiatan yang dipanggil dalam satu contoh dengan Kegiatan pemanggilan, sedangkan singleTask akan memungkinkan untuk Kegiatan yang dipanggil memiliki identitas mereka sendiri yang cukup untuk menekan tombol tekan berfungsi agar berfungsi sebagaimana mestinya.

Gagak
sumber
0
{ getApplicationContext.finish();   }

Coba metode ini ..

Abhishek
sumber
Meskipun blok kode ini dapat menjawab pertanyaan, akan lebih baik jika Anda bisa memberikan sedikit penjelasan mengapa demikian.
David
0

mungkin saja Anda menelepon selesai (); dalam acara klik tombol sehingga kegiatan utama ditutup setelah Anda mengklik tombol dan ketika Anda kembali dari kegiatan berikutnya aplikasi keluar karena kegiatan utama sudah ditutup dan tidak ada aktivitas aktif.

raman rayat
sumber
0

di metode onCreate aktivitas Anda menulis kode berikut.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

Kemudian ganti metode onOptionsItem yang dipilih dari aktivitas Anda sebagai berikut

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

Dan Anda baik untuk pergi.

Hagos Alema
sumber
0

Anda harus menggunakan ini di MainActivity Anda

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

Bendera akan memulai beberapa tugas yang akan menjaga MainActivity Anda, saat Anda selesai menelepon, ia akan mematikan aktivitas lain dan membuat Anda kembali ke MainActivity

Rafat
sumber