Semua aktivitas dalam aplikasi saya mengharuskan pengguna untuk masuk untuk melihat. Pengguna dapat keluar dari hampir semua aktivitas. Ini adalah persyaratan aplikasi. Kapan saja jika pengguna log-out, saya ingin mengirim pengguna ke Login Activity
. Pada titik ini saya ingin kegiatan ini berada di bagian bawah tumpukan riwayat sehingga menekan tombol "kembali" mengembalikan pengguna ke layar beranda Android.
Saya telah melihat pertanyaan ini menanyakan beberapa tempat yang berbeda, semua menjawab dengan jawaban yang sama (yang saya uraikan di sini), tetapi saya ingin mengajukannya di sini untuk mengumpulkan umpan balik.
Saya sudah mencoba membuka aktivitas Login dengan mengatur Intent
benderanya FLAG_ACTIVITY_CLEAR_TOP
yang tampaknya melakukan seperti yang dijelaskan dalam dokumentasi, tetapi tidak mencapai tujuan saya menempatkan aktivitas Login di bagian bawah tumpukan riwayat, dan mencegah pengguna menavigasi kembali untuk aktivitas masuk yang sebelumnya terlihat. Saya juga mencoba menggunakan android:launchMode="singleTop"
untuk aktivitas Login di manifes, tetapi ini juga tidak mencapai tujuan saya (dan sepertinya tidak berpengaruh).
Saya percaya saya harus menghapus tumpukan sejarah, atau menyelesaikan semua kegiatan yang sebelumnya dibuka.
Salah satu opsi adalah memiliki onCreate
status masuk log aktivitas masing-masing , dan finish()
jika tidak login. Saya tidak suka opsi ini, karena tombol kembali masih akan tersedia untuk digunakan, menavigasi kembali ketika kegiatan menutup diri.
Opsi berikutnya adalah mempertahankan LinkedList
referensi untuk semua aktivitas terbuka yang dapat diakses secara statis dari mana saja (mungkin menggunakan referensi yang lemah). Pada logout saya akan mengakses daftar ini dan mengulangi semua kegiatan yang sebelumnya dibuka, meminta finish()
masing-masing. Saya mungkin akan segera mulai menerapkan metode ini.
Saya lebih suka menggunakan beberapa Intent
flag trickery untuk melakukan hal ini. Saya akan sangat senang menemukan bahwa saya dapat memenuhi persyaratan aplikasi saya tanpa harus menggunakan salah satu dari dua metode yang telah saya uraikan di atas.
Apakah ada cara untuk mencapai ini dengan menggunakan Intent
atau memanifestasikan pengaturan, atau apakah opsi kedua saya, mempertahankan LinkedList
aktivitas terbuka adalah pilihan terbaik? Atau ada opsi lain yang sepenuhnya saya abaikan?
Tampaknya sebuah ritus perikop yang seorang programmer Android baru habiskan sehari untuk meneliti masalah ini dan membaca semua utas StackOverflow ini. Saya sekarang baru diinisiasi dan meninggalkan jejak pengalaman sederhana saya di sini untuk membantu peziarah masa depan.
Pertama, tidak ada cara yang jelas atau langsung untuk melakukan ini per penelitian saya
(as of September 2012).
Anda akan berpikir Anda bisa sederhanastartActivity(new Intent(this, LoginActivity.class), CLEAR_STACK)
tetapi tidak .Anda BISA lakukan
startActivity(new Intent(this, LoginActivity.class))
denganFLAG_ACTIVITY_CLEAR_TOP
- dan ini akan menyebabkan kerangka kerja untuk mencari ke bawah tumpukan, menemukan contoh asli Anda sebelumnya dari LoginActivity, membuatnya kembali dan menghapus sisa tumpukan (ke atas). Dan karena Login mungkin ada di bagian bawah tumpukan, Anda sekarang memiliki tumpukan kosong dan tombol Kembali baru saja keluar dari aplikasi.TETAPI - ini hanya berfungsi jika Anda sebelumnya membiarkan instance asli LoginActivity hidup di dasar tumpukan Anda. Jika, seperti banyak programmer, Anda memilih
finish()
ituLoginActivity
setelah pengguna berhasil masuk, maka itu tidak lagi di dasar tumpukan danFLAG_ACTIVITY_CLEAR_TOP
semantik tidak berlaku ... Anda akhirnya membuat yang baruLoginActivity
di atas tumpukan yang ada. Yang hampir pasti BUKAN apa yang Anda inginkan (perilaku aneh di mana pengguna dapat 'kembali' keluar dari login ke layar sebelumnya).Jadi, jika sebelumnya Anda telah
finish()
melakukannyaLoginActivity
, Anda perlu mengejar beberapa mekanisme untuk membersihkan tumpukan Anda dan kemudian memulai yang baruLoginActivity
. Sepertinya jawaban@doreamon
di utas ini adalah solusi terbaik (setidaknya bagi mata saya yang rendah hati):https://stackoverflow.com/a/9580057/614880
Saya sangat curiga bahwa implikasi rumit dari apakah Anda membiarkan LoginActivity hidup-hidup menyebabkan banyak kebingungan ini.
Semoga berhasil.
sumber
MEMPERBARUI
finishAffinity()
metode super akan membantu mengurangi kode tetapi mencapai hal yang sama. Ini akan menyelesaikan aktivitas saat ini serta semua aktivitas di tumpukan, gunakangetActivity().finishAffinity()
jika Anda berada dalam sebuah fragmen.JAWABAN ASLI
Asumsikan LoginActivity -> HomeActivity -> ... -> SettingsActivity panggilan signOut ():
BerandaAktivitas:
Ini bekerja untuk saya, semoga bermanfaat bagi Anda juga. :)
sumber
Jika Anda menggunakan API 11 atau lebih tinggi, Anda dapat mencoba ini: -
FLAG_ACTIVITY_CLEAR_TASK
sepertinya mengatasi masalah yang Anda alami. Jelas kerumunan pra-API 11 harus menggunakan beberapa kombinasi dari semua aktivitas untuk memeriksa tambahan, seperti yang disarankan @doreamon, atau tipuan lainnya.(Perhatikan juga: untuk menggunakan ini, Anda harus masuk
FLAG_ACTIVITY_NEW_TASK
)sumber
finish();
akan melakukan pekerjaan untuk mencegah kembali setelah keluar. Apa perlunya mengatur bendera?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? Letakkan 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
FLAG_ACTIVITY_CLEAR_TASK
belum ditambahkanBanyak jawaban. Mungkin yang ini juga akan membantu-
Versi Kotlin-
sumber
Gunakan ini harus membantu Anda. Jawaban xbakesx sedikit dimodifikasi.
sumber
Solusi yang diterima tidak benar, ia memiliki masalah karena menggunakan penerima siaran bukan ide yang baik untuk masalah ini. Jika aktivitas Anda telah memanggil metode onDestroy (), Anda tidak akan mendapatkan penerima. Solusi terbaik adalah memiliki nilai boolean pada preferensi bersama Anda, dan memeriksanya dalam metode onCreate () aktivitas Anda. Jika tidak boleh dipanggil saat pengguna tidak masuk, maka selesaikan aktivitas. Berikut ini contoh kode untuk itu. Sangat sederhana dan berfungsi untuk setiap kondisi.
sumber
onResume()
metode. Karena ketika Anda menekan tombol kembali, aktivitas lebih mungkin untuk dilanjutkan daripada dibuat.Beberapa waktu
finish()
tidak berfungsiSaya telah memecahkan masalah itu dengan
finishAffinity()
sumber
Saya menyarankan pendekatan yang berbeda untuk pertanyaan ini. Mungkin ini bukan yang paling efisien, tapi saya pikir ini yang paling mudah untuk diterapkan dan hanya membutuhkan sedikit kode. Menulis kode berikutnya dalam aktivitas pertama Anda (aktivitas login, dalam kasus saya) tidak akan membiarkan pengguna kembali ke aktivitas yang diluncurkan sebelumnya setelah keluar.
Saya berasumsi bahwa LoginActivity selesai tepat setelah pengguna masuk, sehingga ia tidak dapat kembali lagi nanti dengan menekan tombol kembali. Sebagai gantinya, pengguna harus menekan tombol logout di dalam aplikasi agar dapat logout dengan benar. Apa yang diterapkan tombol keluar ini adalah maksud sederhana sebagai berikut:
Semua saran dipersilahkan.
sumber
Jawaban yang dipilih cerdas dan rumit. Begini cara saya melakukannya:
LoginActivity adalah aktivitas root dari tugas, set android: noHistory = "true" untuk itu di Manifest.xml; Katakanlah Anda ingin keluar dari SettingsActivity, Anda dapat melakukannya seperti di bawah ini:
sumber
Inilah solusi yang saya buat di aplikasi saya.
Di LoginActivity saya, setelah berhasil memproses login, saya memulai yang berikutnya tergantung pada level API.
Kemudian dalam metode onActivityForResult LoginActivity saya:
Akhirnya, setelah memproses logout di Aktivitas lain:
Ketika di Gingerbread, membuatnya jadi jika saya menekan tombol kembali dari MainActivity, LoginActivity segera disembunyikan. Di Honeycomb dan yang lebih baru, saya baru saja menyelesaikan LoginActivity setelah memproses login dan dibuat kembali dengan benar setelah memproses logout.
sumber
Ini bekerja untuk saya:
sumber
Mulai aktivitas Anda dengan StartActivityForResult dan saat Anda logout atur hasil Anda dan sesuai dengan hasil Anda selesaikan aktivitas Anda
sumber
Solusi @doreamon yang disediakan berfungsi dengan baik untuk semua kasus kecuali satu:
Jika Setelah login, pengguna layar Killing Login menavigasi langsung ke layar tengah. mis. Dalam aliran A-> B-> C, navigasikan seperti: Login -> B -> C -> Tekan pintasan ke rumah. Menggunakan FLAG_ACTIVITY_CLEAR_TOP hanya menghapus aktivitas C, Karena Beranda (A) tidak ada di riwayat tumpukan. Menekan Kembali pada layar A akan membawa kita kembali ke B.
Untuk mengatasi masalah ini, Kami dapat menyimpan setumpuk aktivitas (Arraylist) dan ketika rumah ditekan, kami harus membunuh semua aktivitas dalam tumpukan ini.
sumber
Itu dimungkinkan dengan mengelola bendera di SharedPreferences atau dalam Aktivitas Aplikasi.
Pada awal aplikasi (pada Layar Splash) atur flag = false; Pada acara Klik Keluar, tetapkan flag true dan di OnResume () dari setiap aktivitas, periksa apakah flag benar, lalu panggil finish ().
Ini bekerja seperti pesona :)
sumber
pada klik Logout Anda dapat memanggil ini
onActivityResult () dari Aktivitas sebelumnya memanggil kode di atas ini lagi sampai Anda menyelesaikan semua aktivitas.
sumber
Yang ingin Anda lakukan adalah panggilan keluar () dan selesai () pada metode onStop () atau onPause () Anda. Ini akan memaksa Android untuk memanggil onCreate () saat aktivitas dijalankan kembali karena ia tidak akan memilikinya lagi di tumpukan aktivitasnya. Kemudian lakukan seperti yang Anda katakan, di onCreate () periksa status masuk dan teruskan ke layar masuk jika tidak masuk.
Hal lain yang dapat Anda lakukan adalah memeriksa status masuk di onResume (), dan jika tidak masuk, selesai () dan luncurkan aktivitas masuk.
sumber