Bagaimana cara mencegah kembali ke aktivitas sebelumnya?

210

Ketika tombol BACK ditekan pada ponsel, saya ingin mencegah aktivitas tertentu kembali ke yang sebelumnya.

Secara khusus, saya memiliki layar masuk dan pendaftaran, keduanya memulai aktivitas baru yang disebut HomeScreensaat masuk / pendaftaran berhasil. Setelah HomeScreen dimulai, saya ingin mencegah pengguna untuk dapat kembali ke login atau mendaftar layar dengan menekan tombol BACK.

Saya mencoba menggunakan Intent.FLAG_ACTIVITY_NO_HISTORY, tetapi karena aplikasi memiliki integrasi Facebook, ketika 'Login dengan Facebook' digunakan, Facebook harus kembali ke layar login awal, oleh karena itu saya harus menyimpan riwayat kegiatan ini.

Saya berpikir untuk mengesampingkan perilaku tombol BACK pada HomeScreenuntuk langsung menyelesaikan aplikasi ketika tombol ditekan dan saya gunakan

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

tapi itu juga tidak berhasil.

ecem
sumber
1
Hanya untuk memperjelas, Anda mencoba menangkap kembali perilaku untuk semua orang kecuali facebook?
havexz
2
Dalam beberapa hal ya, tetapi sebenarnya yang saya inginkan adalah setelah login berhasil dan HomeScreen terbuka, pengguna seharusnya tidak dapat kembali ke layar login dengan menekan tombol BACK. Sama seperti Twitter atau Foursquare misalnya, setelah kami masuk ke aplikasi itu, kami tidak melihat halaman masuk sampai kami keluar (bahkan jika kami menekan KEMBALI setelah masuk).
ecem

Jawaban:

345

Saran saya adalah untuk menyelesaikan aktivitas yang Anda tidak ingin kembali ke pengguna. Misalnya, dalam aktivitas masuk Anda, tepat setelah Anda menelepon startActivity, panggil finish(). Ketika pengguna menekan tombol kembali, mereka tidak akan dapat pergi ke aktivitas masuk karena telah dimatikan dari tumpukan.

pembuat kode
sumber
2
Bagaimana jika saya ingin utas di aktivitas sebelumnya tetap berjalan?
AlleyOOP
2
Anda tidak akan mau pergi dengan pendekatan saya itu. Memanggil selesai () akan mematikan aktivitas. Bisakah Anda memulai proses yang ingin Anda jalankan dalam aktivitas yang Anda tuju?
coder
7
Catatan: jika Anda menelepon finishselama transisi bersama, Anda mungkin mengalami pendarahan dari aktivitas sebelumnya. misalnya, jika Anda memiliki HomeActivity-> IntermediateActivity-> FinalActivity, dan Anda menelepon finish()di IntermediateActivitysegera setelah memulai FinalActivityAnda akan melihat HomeActivityuntuk sesaat.
David Murdoch
101

Solusi berikut dapat sangat berguna dalam skenario login / aktivitas utama biasa atau menerapkan layar pemblokiran.

Untuk meminimalkan aplikasi daripada kembali ke aktivitas sebelumnya, Anda dapat mengganti onBackPressed()seperti ini:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot)meninggalkan tumpukan belakang Anda apa adanya, hanya menempatkan tugas Anda (semua aktivitas) di latar belakang. Sama seperti jika pengguna menekan tombol Home .

Parameter boolean nonRoot- Jika salah maka ini hanya berfungsi jika aktivitas adalah akar dari tugas; jika benar itu akan berfungsi untuk aktivitas apa pun dalam tugas.

Marcel Bro
sumber
3
Sempurna untuk layar masuk karena menjaga sejarah tetap utuh.
Hackmodford
Terima kasih, saya mencoba menemukan ini selama sekitar tiga hari. Karena android: noHistory = "true" flag untuk Activity tidak berfungsi seperti yang diharapkan (flag noHistory menciptakan kembali aktivitas setelah minimisasi) dan finish () terkadang tidak bekerja untuk saya, tetapi mengapa saya masih tidak mengerti.
Denshov
37

Saya tidak yakin persis apa yang Anda inginkan, tetapi sepertinya itu mungkin, dan sepertinya Anda sudah berada di jalur yang benar.

Berikut beberapa tautan yang mungkin membantu:

Nonaktifkan tombol kembali di android

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

Bagaimana saya bisa menonaktifkan 'kembali' ke beberapa aktivitas?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>
paulsm4
sumber
1
Saya tidak dapat menggunakan opsi noHistory karena masalah Facebook yang saya coba jelaskan dalam pertanyaan saya dan juga salah satu komentar. Tapi masalahnya dengan tombol BACK tidak menonaktifkannya, tetapi membuatnya keluar dari seluruh aplikasi seperti System.exit(0)disebut (Saya tahu itu bukan praktik terbaik, tapi saya hanya ingin memberi contoh).
ecem
Terima kasih ini berhasil. Hanya saran yang akan kubuat di sini, tidak perlu kembali. Hapus saja super.onBackPressed (); dan biarkan metode ini kosong. Itu bekerja dengan baik juga
hyperCoder
20

Ada dua solusi untuk kasus Anda, aktivitas A memulai aktivitas B, tetapi Anda tidak ingin kembali ke aktivitas A dalam aktivitas B.

1. Aktivitas A yang dihapus sebelumnya dari tumpukan belakang.

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2. Dinonaktifkan kembali tombol aksi dalam aktivitas B.

Ada dua cara untuk mencegah acara kembali seperti di bawah ini,

1) Merekomendasikan pendekatan

@Override
public void onBackPressed() {
}

2) Ganti metode onKeyDown

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

Semoga bermanfaat, tapi tetap tergantung situasi Anda.

Luna Kong
sumber
3
Bukankah pengalaman pengguna yang buruk untuk menonaktifkan onBackPressed ()?
C. Skjerdal
Ini benar-benar tergantung pada apa yang Anda coba buat, dalam fungsionalitas aplikasi perlu ini kemudian pergi untuk itu.
user3099225
Sungguh menakjubkan bagaimana saya benar-benar lupa tentang metode pertama yang digunakan finish(). Dipertimbangkan dengan nohistoryatribut yang tidak perlu , bendera maksud, tag manifes aktivitas induk, dll! Konyol, terima kasih atas jawabannya!
varun
8

Karena sudah ada banyak solusi hebat yang disarankan, saya akan mencoba memberikan penjelasan yang lebih cerdik.

Bagaimana cara melewatkan kembali ke aktivitas sebelumnya?

Hapus Aktivitas sebelumnya dari Backstack. Sederhana

Bagaimana cara menghapus Aktivitas sebelumnya dari Backstack?

finish()Metode panggilan

Aliran Normal:

masukkan deskripsi gambar di sini
Semua aktivitas disimpan dalam tumpukan yang dikenal sebagai Backstack.
Ketika Anda memulai Kegiatan baru ( startActivity(...)) maka Kegiatan baru didorong ke atas tumpukan dan ketika Anda menekan tombol kembali Kegiatan dikeluarkan dari tumpukan.
Satu poin kunci yang perlu diperhatikan adalah bahwa ketika tombol kembali ditekan makafinish(); metode disebut secara internal. Ini adalah perilaku default metode onBackPressed ().

Jadi, jika Anda ingin melewati Aktivitas B?

yaitu A <--- C

Cukup tambahkan finish();metode setelah Anda startActvity(...)dalam Aktivitas B

Intent i = new Intent(this, C.class);
startActivity(i);
finish();

masukkan deskripsi gambar di sini

Rohit Singh
sumber
6

finish()memberi Anda metode untuk menutup Aktivitas saat ini, bukan seluruh aplikasi. Dan sebaiknya Anda tidak mencoba mencari metode untuk mematikan aplikasi. Sedikit saran.

Sudahkah Anda mencoba kata penghubung Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? Ingatlah untuk menggunakan bendera ini dalam Intentmemulai aktivitas!

mayat
sumber
2
FLAG_ACTIVITY_NO_HISTORYmencegah LoginScreen saya untuk menangkap panggilan balik Facebook ketika Login dengan Facebook digunakan. Karena begitu fokus keluar dari LoginScreen tidak dapat dilanjutkan (karena tidak ada riwayat). Tapi saya belum mencobanya Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS, saya akan memeriksanya, terima kasih!
ecem
juga terima kasih tentang finish()metode ini, saya tidak tahu tentang itu.
ecem
4

Taruh finish()setelah

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();
Param Trivedi
sumber
1
Ini pada dasarnya adalah jawaban yang diterima dari empat tahun sebelumnya.
TylerH
3

Jawaban paulsm4 adalah yang benar. Jika onBackPressed()Anda hanya kembali, itu akan menonaktifkan tombol kembali. Namun, saya pikir pendekatan yang lebih baik mengingat kasus penggunaan Anda adalah membalikkan logika aktivitas, yaitu menjadikan aktivitas rumah Anda yang utama, periksa apakah pengguna masuk di sana, jika tidak, mulai aktivitas masuk. Alasannya adalah bahwa jika Anda mengganti tombol kembali dalam aktivitas utama Anda, sebagian besar pengguna akan bingung ketika mereka menekan kembali dan aplikasi Anda tidak melakukan apa pun.

dmon
sumber
3

Metode ini berfungsi dengan baik

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
pulak
sumber
2

Cukup timpa metode onKeyDown dan periksa apakah tombol kembali ditekan.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}
Suku Mesin
sumber
1
@Override
public void onBackPressed() {
}

Ketika Anda membuat onBackPressed()cukup hapus super.onBackPressed();dan itu akan berhasil

hyperCoder
sumber
1

Taruh

finish();

segera setelah ActivityStart untuk menghentikan aktivitas mencegah cara kembali ke sana. Lalu tambahkan

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

ke aktivitas yang Anda mulai.

Brandon Dyer
sumber