Saya mengembangkan aplikasi android untuk sementara waktu, dan mengikuti banyak posting tentang siklus hidup aktivitas, dan siklus hidup aplikasi.
Saya tahu Activity.finish()
panggilan metode di suatu tempat di jalan ke Activity.onDestroy()
, dan juga menghapus aktivitas dari tumpukan, dan saya kira itu entah bagaimana menunjuk ke sistem operasi dan pengumpul sampah bahwa ia dapat "melakukan triknya" dan membebaskan memori ketika itu menemukan waktu yang baik melakukan begitu....
Saya datang ke pos ini - Apakah berhenti dari aplikasi disukai? dan baca jawaban Mark Murphy.
Itu membuat saya sedikit bingung tentang apa sebenarnya finish()
metode ini.
Apakah ada kemungkinan saya akan menelepon finish()
dan onDestroy()
tidak akan dipanggil?
Jawaban:
Saat memanggil
finish()
suatu aktivitas, metodeonDestroy()
ini dijalankan. Metode ini dapat melakukan hal-hal seperti:Juga,
onDestroy()
bukan destruktor. Itu tidak benar-benar menghancurkan objek. Itu hanya metode yang disebut berdasarkan kondisi tertentu. Jadi instance Anda masih hidup dan sangat baik * setelah superclassonDestroy()
berjalan dan kembali. Android terus memproses jika pengguna ingin me-restart aplikasi, ini membuat fase startup lebih cepat. Proses tidak akan melakukan apa pun dan jika ingatan perlu direklamasi, proses itu akan dimatikansumber
2 sen saya pada jawaban @K_Anas. Saya melakukan tes sederhana pada metode finish (). Mencantumkan metode panggilan balik penting dalam siklus hidup aktivitas
Yang ingin saya katakan adalah bahwa rekan-rekan dari metode bersama dengan metode di antaranya dipanggil ketika finish () dieksekusi.
misalnya:
sumber
Perhatikan juga jika Anda memanggil selesai () setelah niat, Anda tidak dapat kembali ke aktivitas sebelumnya dengan tombol "kembali"
sumber
onDestroy()
dimaksudkan untuk pembersihan akhir - membebaskan sumber daya yang Anda dapat sendiri, menutup koneksi terbuka, pembaca, penulis, dll. Jika Anda tidak menimpanya, sistem melakukan apa yang harus dilakukan.di sisi lain,
finish()
biarkan sistem tahu bahwa pemrogram ingin arusActivity
diselesaikan. Dan karenanya, ia memanggilonDestroy()
setelah itu.Sesuatu yang perlu diperhatikan:
tidak perlu hanya panggilan untuk
finish()
memicu panggilanonDestroy()
. Tidak. Seperti yang kita ketahui, sistem android bebas untuk mematikan aktivitas jika merasa ada sumber daya yang dibutuhkan saat iniActivity
yang perlu dibebaskan.sumber
finish()
memberitahu sistem untuk menyelesaikanActivity
. bagian "x" dalam pernyataan do Anda adalah "untuk menyelesaikan (menghancurkan)Activity
". Bagian kedua salah. Sebenarnya, saya melewatkan satu kata di sana. Saya telah mengedit jawabannya.onDestroy()
tidak hanya dipicu olehfinish()
, sistem dapat memanggilnya sendiri juga.Metode Finish () akan menghancurkan aktivitas saat ini. Anda dapat menggunakan metode ini jika Anda tidak ingin aktivitas ini dimuat lagi dan lagi saat pengguna menekan tombol kembali. Pada dasarnya itu membersihkan aktivitas dari tumpukan .current.
sumber
Selain jawaban @rommex di atas, saya juga memperhatikan bahwa
finish()
antrian penghancuran Aktivitas dan tergantung pada prioritas Kegiatan.Jika saya memanggil
finish()
setelahonPause()
, saya melihatonStop()
, danonDestroy()
segera menelepon.Jika saya menelepon
finish()
setelahonStop()
, saya tidak melihatonDestroy()
sampai 5 menit kemudian.Dari pengamatan saya, sepertinya selesai di-antri dan ketika saya melihat
adb shell dumpsys activity activities
itu diaturfinishing=true
, tetapi karena tidak lagi di latar depan, itu tidak diprioritaskan untuk penghancuran.Singkatnya,
onDestroy()
tidak pernah dijamin untuk dipanggil, tetapi bahkan dalam kasus itu disebut, itu bisa ditunda.sumber
Berbagai jawaban dan catatan mengklaim bahwa finish () dapat melewati onPause () dan onStop () dan langsung menjalankan onDestroy (). Agar adil, dokumentasi Android tentang ini ( http://developer.android.com/reference/android/app/Activity.html ) mencatat "Aktivitas sedang selesai atau dihancurkan oleh sistem" yang cukup ambigu tetapi mungkin menyarankan bahwa finish () dapat melompat ke onDestroy ().
JavaDoc on finish () juga mengecewakan ( http://developer.android.com/reference/android/app/Activity.html#finish () ) dan tidak benar-benar mencatat metode apa yang disebut sebagai respons terhadap penyelesaian. ().
Jadi saya menulis aplikasi mini ini di bawah ini yang mencatat setiap negara bagian saat masuk. Ini termasuk tombol yang memanggil selesai () - sehingga Anda dapat melihat log metode mana yang dipecat. Eksperimen ini menyarankan bahwa finish () memang juga memanggil onPause () dan onStop (). Ini adalah output yang saya dapatkan:
sumber
@ user3282164 Menurut siklus hidup Aktivitas, ia harus melalui
onPause()
->onStop()
->onDestroy()
saat meneleponfinish()
.Diagram tidak menunjukkan jalur lurus dari [Activity Running] ke [
onDestroy()
] yang disebabkan oleh sistem.onStop () doc mengatakan " Perhatikan bahwa metode ini mungkin tidak pernah dipanggil, dalam situasi memori rendah di mana sistem tidak memiliki cukup memori untuk menjaga proses aktivitas Anda berjalan setelah metode onPause () dipanggil. "
sumber
Penelitian saya menunjukkan bahwa
finish()
metode sebenarnya menempatkan beberapa operasi penghancuran dalam antrian, tetapi Kegiatan tidak segera dihancurkan. Penghancuran dijadwalkan.Misalnya, jika Anda menempatkan
finish()
dionActivityResult()
callback, sementaraonResume()
belum berjalan, maka pertamaonResume()
akan dieksekusi, dan hanya setelah ituonStop()
danonDestroy()
disebut.CATATAN:
onDestroy()
tidak dapat dipanggil sama sekali, seperti yang dinyatakan pada dokumentasi .sumber
memanggil selesai di onCreate () tidak akan memanggil onDestroy () secara langsung seperti kata @prakash. The
finish()
operasi bahkan tidak akan dimulai sampai Anda kembali kontrol untuk Android.Memanggil selesai () di onCreate () : onCreate () -> onStart () -> onResume () . Jika pengguna keluar dari aplikasi akan memanggil -> onPause () -> onStop () -> onDestroy ()
Memanggil selesai () di onStart () : onCreate () -> onStart () -> onStop () -> onDestroy ()
Memanggil selesai () di onResume () : onCreate () -> onStart () -> onResume () -> onPause () -> onStop () -> onSest () -> onDestroy ()
Untuk referensi lebih lanjut, lihat pada oncreate ini terus menerus setelah selesai & sekitar selesai ()
sumber
Tampaknya satu-satunya jawaban yang benar di sini sejauh ini telah diberikan oleh romnex: "onDestroy () mungkin tidak disebut sama sekali". Meskipun dalam praktiknya, dalam hampir semua kasus itu akan, tidak ada jaminan: Dokumentasi pada selesai () hanya menjanjikan bahwa hasil kegiatan disebarkan kembali ke penelepon, tetapi tidak lebih. Selain itu, dokumentasi siklus hidup mengklarifikasi bahwa aktivitas tersebut dapat dibunuh oleh OS segera setelah onStop () selesai (atau bahkan lebih awal pada perangkat yang lebih tua), yang, meskipun tidak mungkin dan karena itu jarang diamati dalam tes sederhana, mungkin berarti aktivitas tersebut mungkin terbunuh ketika atau bahkan sebelum onDestroy () dieksekusi.
Jadi, jika Anda ingin memastikan beberapa pekerjaan selesai ketika Anda memanggil selesai (), Anda tidak bisa memasukkannya ke dalam onDestroy (), tetapi harus dilakukan di tempat yang sama di mana Anda memanggil selesai (), tepat sebelum benar-benar memanggilnya.
sumber
finish () baru saja mengirim kembali ke aktivitas sebelumnya di android, atau mungkin Anda dapat mengatakan bahwa itu akan mundur satu langkah dalam aplikasi
sumber