Apakah mungkin untuk memulai suatu kegiatan di tumpukan, membersihkan seluruh riwayat sebelum itu?
Situasi
Saya memiliki tumpukan aktivitas yang berjalan A-> B-> C atau B-> C (layar A memilih token pengguna, tetapi banyak pengguna hanya memiliki token tunggal).
Di layar C pengguna dapat mengambil tindakan yang membuat layar B tidak valid, sehingga aplikasi ingin membawanya ke layar A, terlepas dari apakah itu sudah ada di tumpukan. Layar A seharusnya menjadi satu-satunya item di tumpukan dalam aplikasi saya.
Catatan
Ada banyak pertanyaan serupa lainnya, tetapi saya belum menemukan apa pun yang menjawab pertanyaan persis ini. Saya mencoba menelepon getParent().finish()
- ini selalu menghasilkan pengecualian pointer nol. FLAG_ACTIVITY_CLEAR_TOP
hanya berfungsi jika aktivitas sudah di stack.
sumber
Kasus 1: Hanya dua aktivitas A dan B:
Di sini, Alur aktivitas adalah A-> B. Pada mengklik tombol backb dari B kita perlu menutup aplikasi kemudian sambil memulai Aktivitas B dari A just call finish () ini akan mencegah android menyimpan Aktivitas A ke dalam Backstack.eg untuk aktivitas A adalah Layar Loding / Splash aplikasi.
Kasus 2: Lebih dari dua kegiatan:
Jika ada aliran seperti A-> B-> C-> D-> B dan mengklik tombol kembali di Kegiatan B saat datang dari Kegiatan D. Dalam hal itu kita harus menggunakan.
Di sini Aktivitas B akan dimulai dari backstack daripada contoh baru karena Intent.FLAG_ACTIVITY_CLEAR_TOP dan Intent.FLAG_ACTIVITY_NEW_TASK membersihkan tumpukan dan menjadikannya yang teratas. Jadi ketika kita menekan tombol kembali seluruh aplikasi akan dihentikan.
sumber
Dengan Android Versi Baru> = API 16 digunakan
finishAffinity()
pendekatan ini cocok untuk> = API 16.
sumber
Saya menghabiskan beberapa jam untuk hal ini juga ... dan setuju bahwa FLAG_ACTIVITY_CLEAR_TOP terdengar seperti yang Anda inginkan: kosongkan seluruh tumpukan, kecuali untuk aktivitas yang diluncurkan, jadi tombol Kembali keluar dari aplikasi. Namun seperti yang disebutkan Mike Repass, FLAG_ACTIVITY_CLEAR_TOP hanya berfungsi ketika aktivitas yang Anda luncurkan sudah ada di tumpukan; ketika aktivitas tidak ada di sana, bendera tidak melakukan apa-apa.
Apa yang harus dilakukan? Masukkan aktivitas yang diluncurkan di tumpukan dengan FLAG_ACTIVITY_NEW_TASK, yang menjadikan aktivitas itu sebagai awal dari tugas baru di tumpukan riwayat. Kemudian tambahkan flag FLAG_ACTIVITY_CLEAR_TOP.
Sekarang, ketika FLAG_ACTIVITY_CLEAR_TOP pergi untuk mencari aktivitas baru di stack, itu akan ada di sana dan ditarik sebelum semua yang lain dihapus.
Inilah fungsi logout saya; parameter View adalah tombol yang dilampirkan fungsi.
sumber
Anda tidak harus mengubah tumpukan. Tombol kembali Android seharusnya berfungsi seperti pada browser web.
Saya bisa memikirkan cara untuk melakukannya, tetapi itu cukup hack.
Jadikan Aktivitas Anda
singleTask
dengan menambahkannya keAndroidManifest
Contoh:Perluas
Application
yang akan menyimpan logika ke mana harus pergi.Contoh:
Dari A ke B:
Dari B ke C:
Dalam C:
dan menangani tombol kembali ke
pop()
dari tumpukan.Sekali lagi, Anda tidak harus melakukan ini :)
sumber
Application
mengambil contoh mereka, OS tidak akan dapat membebaskan RAM yang tersisa dari aktivitas yang dihancurkan.Segera setelah Anda memulai aktivitas baru, menggunakan
startActivity
, pastikan Anda meneleponfinish()
agar aktivitas saat ini tidak ditumpuk di belakang yang baru.sumber
Coba ini:
sumber
Kotlin yang Dapat Digunakan Kembali Lanjut:
Anda dapat mengatur bendera secara langsung menggunakan metode penyetel. Di Kotlin
or
adalah pengganti untuk bitwise Java atau|
.Jika Anda berencana untuk menggunakan ini secara teratur, buat fungsi ekstensi Intent
Anda kemudian dapat langsung memanggil fungsi ini sebelum memulai niat
Jika Anda memerlukan opsi untuk menambahkan flag tambahan dalam situasi lain, tambahkan param opsional ke fungsi ekstensi.
sumber
sumber
Coba kode di bawah ini,
sumber
Bagi saya tidak ada metode di atas tidak berfungsi.
Lakukan ini untuk menghapus semua aktivitas sebelumnya :
sumber
Terkadang emulator android Anda mungkin gagal menghubungkan alat DDMS eclipse dan meminta adb untuk memulai secara manual. Dalam hal ini Anda dapat memulai atau menghentikan adb menggunakan command prompt.
sumber
Saya menemukan hack terlalu sederhana lakukan ini tambahkan elemen baru
AndroidManifest
sebagai: -yang
android:noHistory
akan menghapus aktivitas yang tidak diinginkan Anda dari Stack.sumber