Android menghancurkan aktivitas, proses pembunuhan

117

Hai, saya bertanya-tanya bagaimana Android mengelola memori dan saya tidak dapat menemukan jawaban yang tepat di mana pun. Anggaplah saya memiliki aplikasi dengan 5 aktivitas pada tumpukan aktivitas saat ini (4 dihentikan dan 1 dilanjutkan), tidak ada layanan yang terhubung. Saya menekan tombol HOME agar semua aktivitas saya dihentikan. Saya memulai beberapa aplikasi lain yang menghabiskan memori dan keseluruhan memori perangkat mulai rendah. Dan pertanyaannya adalah

... Apa yang akan terjadi dengan lamaran saya?

  1. Dapatkah sistem menghancurkan hanya satu atau beberapa aktivitas saya untuk memulihkan memori?
  2. Apakah sistem akan menghentikan seluruh proses aplikasi saya? Akankah semua aktivitas dihancurkan dengan baik?
  3. Apa yang akan terjadi ketika saya kembali ke aplikasi saya ketika aplikasi itu benar-benar mati? Apakah akan dimulai dari awal (seperti awal pertama) atau akan mencoba memulihkan aktivitas ke keadaan sebelumnya / jika ya - apakah hanya satu yang ada di atas tumpukan atau semuanya?

MEMPERBARUI:

Sebelum mengajukan pertanyaan ini, saya telah melihat Daur hidup aktivitas beberapa kali tetapi tidak memiliki jawaban atas pertanyaan saya. Saya melakukan beberapa tes dan saya punya beberapa jawaban. "Hentikan proses" di DDMS adalah petunjuk untuk pengujian.

Saya belum menguji jawaban untuk pertanyaan 1, tetapi seperti yang dikatakan pemandu:

Jika suatu aktivitas dijeda atau dihentikan, sistem bisa melepaskan aktivitas dari memori dengan memintanya untuk menyelesaikannya, atau cukup menghentikan prosesnya.

Tampaknya satu atau lebih aktivitas dapat dihancurkan dengan lembut (dengan metode onDestroy) tanpa menghentikan proses. Anda hanya akan mendapatkan (onCreate + bundle) saat kembali ke mereka.

Jawaban pertanyaan 2:

IYA. Umumnya sistem mematikan seluruh proses, ini berarti semua data termasuk aktivitas dan bidang statis dihancurkan. Ini TIDAK dilakukan dengan baik - Anda tidak akan mendapatkan onDestroy atau finialize () untuk aktivitas apa pun yang dijeda / dihentikan. Inilah sebabnya mengapa saveInstanceState () dipanggil tepat sebelum metode onPause. onPause pada dasarnya adalah metode terakhir di mana Anda harus menyimpan sesuatu karena setelah metode ini Anda tidak akan pernah bisa melihat onStop atau onDestroy. Sistem hanya dapat menghentikan proses menghancurkan semua objek Anda apa pun yang mereka pegang dan apa pun yang mereka lakukan.

Jawaban pertanyaan 3:

Apa yang akan terjadi jika Anda kembali ke aplikasi yang dimatikan?

  • Sebelum Android 2.2 - aplikasi akan dimulai dari awal, dengan aktivitas peluncur.
  • Mulai dari 2.2 - sistem akan memulihkan status aplikasi sebelumnya. Apa artinya? Artinya, aktivitas terakhir yang terlihat akan dibuat ulang (onCreate + bundle). Apa yang akan terjadi dengan tumpukan aktivitas? Tumpukan baik-baik saja tetapi semua aktivitas di atasnya mati. Masing-masing akan dibuat ulang (onCreate + bundle) saat Anda kembali ke sana dengan tombol kembali. Ada satu hal lagi tentang itu:

Biasanya, sistem menghapus tugas (menghapus semua aktivitas dari tumpukan di atas aktivitas root) dalam situasi tertentu saat pengguna memilih ulang tugas itu dari layar beranda. Biasanya, ini dilakukan jika pengguna belum mengunjungi tugas selama jangka waktu tertentu, seperti 30 menit.

Kesimpulan?

  1. Jangan berpikir bahwa menangani masalah rotasi aktivitas dapat diselesaikan dengan android: configChanges = "orientasi". Ketika Anda melakukannya, Anda akan mendapatkan banyak masalah lain yang bahkan tidak Anda sadari.
  2. Uji aplikasi Anda dengan DDMS - tombol Hentikan proses. Lihat ini
  3. Berhati-hatilah saat menggunakan variabel statis. Jangan berpikir bahwa ketika Anda menginisialisasi mereka dalam aktivitas 1 - Anda akan menginisialisasi mereka dalam aktivitas 2. Satu-satunya tempat aman untuk menginisialisasi statika global adalah kelas Aplikasi.
  4. Ingatlah bahwa Anda mungkin tidak pernah melihat onStop atau onDestroy. Tutup file / database, hentikan pengunduh di onPause. Saat Anda ingin aplikasi melakukan sesuatu di BG - gunakan Layanan latar depan.

Itu saja ... Semoga saya membantu dengan essey saya :)

Menandai
sumber
Sebagai asumsi Anda, apakah 5 aktivitas tersebut berasal dari aplikasi yang sama atau beberapa aplikasi berbeda?
dumbfingers
1
"Saya memiliki aplikasi dengan 5 aktivitas pada tumpukan aktivitas saat ini" Tentu saja semuanya berasal dari aplikasi proses saya yang satu dan sama.
Tandai
4
Terima kasih, ini juga pertanyaan saya ... Pertanyaan dan jawaban Anda sangat membantu saya.
craigrs84
@ Mark: Apakah masalah ini sudah terpecahkan sekarang? Bagaimana jika demikian?
Ameer Moaaviah

Jawaban:

30

Pertama, silakan lihat ini:

img1

onPause () Dipanggil saat sistem akan mulai melanjutkan aktivitas sebelumnya. Ini biasanya digunakan untuk melakukan perubahan yang belum disimpan ke data persisten, menghentikan animasi dan hal lain yang mungkin menggunakan CPU, dll. Implementasi metode ini harus sangat cepat karena aktivitas berikutnya tidak akan dilanjutkan hingga metode ini kembali. Diikuti oleh onResume () jika aktivitas kembali ke depan, atau onStop () jika tidak terlihat oleh pengguna.

onStop () Dipanggil saat aktivitas tidak lagi terlihat oleh pengguna, karena aktivitas lain telah dilanjutkan dan menutupi aktivitas ini. Hal ini dapat terjadi baik karena aktivitas baru sedang dimulai, aktivitas yang sudah ada dibawa ke depan aktivitas ini, atau aktivitas ini sedang dimusnahkan. Diikuti oleh onRestart () jika aktivitas ini kembali untuk berinteraksi dengan pengguna, atau onDestroy () jika aktivitas ini akan ditiadakan.

Jadi, ketika Anda menekan "HOME" tombol pada perangkat Anda, aktivitas foreground Anda saat ini dimasukkan ke onPause()kemudian onStop(), 4 lainnya harus tetaponStop()

Menurut Dokumen Google:

  • Jika aktivitas di latar depan layar (di bagian atas tumpukan), itu aktif atau berjalan.
  • Jika suatu aktivitas telah kehilangan fokus tetapi masih terlihat (yaitu, aktivitas baru yang tidak berukuran penuh atau transparan memiliki fokus di atas aktivitas Anda), aktivitas akan dijeda. Aktivitas yang dijeda benar-benar hidup (mempertahankan semua informasi status dan anggota serta tetap melekat pada pengelola jendela), tetapi dapat dimatikan oleh sistem dalam situasi memori yang sangat rendah.
  • Jika suatu aktivitas sepenuhnya dikaburkan oleh aktivitas lain, itu dihentikan. Ini masih menyimpan semua informasi status dan anggota, namun, tidak lagi terlihat oleh pengguna sehingga jendelanya tersembunyi dan akan sering dimatikan oleh sistem ketika memori dibutuhkan di tempat lain.
  • Jika suatu aktivitas dijeda atau dihentikan, sistem bisa melepaskan aktivitas dari memori dengan memintanya untuk menyelesaikannya, atau cukup menghentikan prosesnya. Saat ditampilkan lagi kepada pengguna, itu harus benar-benar dimulai ulang dan dikembalikan ke keadaan sebelumnya.

Dan, untuk siklus hidup proses:

Siklus Hidup Proses 3. Aktivitas latar belakang (aktivitas yang tidak terlihat oleh pengguna dan telah dijeda) tidak lagi penting, sehingga sistem dapat dengan aman menghentikan prosesnya untuk mendapatkan kembali memori untuk proses latar depan atau yang terlihat lainnya. Jika prosesnya perlu dihentikan, saat pengguna menavigasi kembali ke aktivitas (membuatnya terlihat di layar lagi), metode onCreate (Bundle) akan dipanggil dengan saveInstanceState yang sebelumnya disediakan di onSaveInstanceState (Bundle) sehingga dapat memulai ulang sendiri dalam kondisi yang sama seperti terakhir kali pengguna meninggalkannya.

Semua kutipan di atas berasal dari: Referensi Pengembang Android: Aktivitas

Telah dipastikan bahwa sistem dapat menghancurkan aktivitas non-acitve dan mendaur ulang memori saat Anda meluncurkan beberapa aplikasi yang menghabiskan memori. Dan Anda dapat mengimplementasikan like: isFinishing()dalam aktivitas Anda lalu menggunakan tombol "kill" di DDMS untuk mendeteksi aktivitas mana yang sedang dijatuhkan oleh sistem. Tapi saya kira sistem akan menghancurkan yang tertua dulu. Namun tidak ada gunanya menyimpan aktivitas lain saat "Aktivitas Peluncuran" telah didaur ulang.

MEMPERBARUI

Berikut beberapa pendapat yang saya temukan dari sini :

Status berhenti

Saat suatu aktivitas tidak terlihat, tetapi masih dalam memori, kami mengatakan itu dalam keadaan berhenti. Aktivitas yang dihentikan dapat dibawa kembali ke depan untuk menjadi aktivitas Lari lagi. Atau, itu bisa dihancurkan dan dihapus dari memori.

Sistem mempertahankan aktivitas dalam keadaan berhenti karena kemungkinan pengguna masih ingin kembali ke aktivitas tersebut dalam waktu dekat, dan memulai ulang aktivitas yang dihentikan jauh lebih murah daripada memulai aktivitas dari awal. Itu karena kita sudah memiliki semua objek yang dimuat dalam memori dan hanya harus membawa semuanya ke latar depan.

Aktivitas yang dihentikan dapat dihapus dari memori kapan saja.

dumbfingers
sumber
4
Dokumentasi cukup membingungkan tentang masalah ini, namun hanya keseluruhan proses yang dapat dimatikan, bukan komponen individu (aktivitas, layanan, dll.). Lihat: stackoverflow.com/questions/7536988/…
greg7gkb
Pertanyaan ini harus diperbarui dengan info di tautan komentar @ greg7gkb, menyesatkan
Luke De Feo
1

Dapatkah sistem menghancurkan hanya satu atau beberapa aktivitas saya untuk memulihkan memori?

Iya. Android menghentikan aktivitas yang berjalan di latar belakang saat ada kebutuhan memori. Membunuh satu atau semua mungkin tergantung pada beberapa kondisi. Untuk sebuah instance yang dijeda atau dihentikan bisa membuat android menghentikan aktivitas atau proses itu sendiri. Di sini, di bawah Activity Lifecycle, Anda bisa mendapatkan poin-poin di bawah ini. Saya menyarankan Anda untuk membuka halaman itu sepenuhnya. Itu pasti akan menghapus keraguan Anda.

Jika suatu aktivitas telah kehilangan fokus tetapi masih terlihat (yaitu, aktivitas baru yang tidak berukuran penuh atau transparan memiliki fokus di atas aktivitas Anda), aktivitas akan dijeda. Aktivitas yang dijeda benar-benar hidup (mempertahankan semua informasi status dan anggota serta tetap melekat pada pengelola jendela), tetapi dapat dimatikan oleh sistem dalam situasi memori yang sangat rendah.

Jika suatu aktivitas sepenuhnya dikaburkan oleh aktivitas lain, itu dihentikan. Ini masih menyimpan semua informasi status dan anggota, namun, tidak lagi terlihat oleh pengguna sehingga jendelanya tersembunyi dan akan sering dimatikan oleh sistem ketika memori dibutuhkan di tempat lain.

Jika suatu aktivitas dijeda atau dihentikan, sistem bisa melepaskan aktivitas dari memori dengan memintanya untuk menyelesaikannya, atau cukup menghentikan prosesnya. Saat ditampilkan lagi kepada pengguna, itu harus benar-benar dimulai ulang dan dikembalikan ke keadaan sebelumnya.


Apakah sistem akan menghentikan seluruh proses aplikasi saya? Akankah semua aktivitas dihancurkan dengan baik?

Aktivitas berkaitan dengan individu sedangkan proses berkaitan dengan kelompok aktivitas. Lihatlah poin ketiga di atas lagi itu membunuh proses seperti yang disebutkan.


Apa yang akan terjadi ketika saya kembali ke aplikasi saya ketika aplikasi itu benar-benar mati?

Ini mirip dengan restart. Sekali lagi poin ketiga akan memberi Anda beberapa jawaban sepertiWhen it is displayed again to the user, it must be completely restarted and restored to its previous state

Dapatkan lebih banyak informasi tentang hal-hal yang berhubungan dengan memori di sini .

Edit:
Semua aktivitas dalam aplikasi berjalan dalam satu proses. Jadi ketika sebuah proses dimatikan semua aktivitas tidak peduli 5 atau 10 akan dibunuh yaitu, dimulai kembali. Restart akan menyebabkan aplikasi Anda untuk memulai dari awal tanpa status tersimpan.

Vinay
sumber
2
Saya telah melihat Daur Hidup Aktivitas setidaknya 5 kali tetapi tidak menjawab pertanyaan saya. Apa yang Anda katakan akan berarti ketika proses aplikasi saya mati - ketika saya kembali ke aplikasi, itu dipulihkan ke keadaan sebelumnya. Jadi ketika saya menghentikan 5 aktivitas .. apakah mereka semua mati (onDestroy dipanggil) ketika proses dimatikan? Ketika saya kembali ke aplikasi saya, apakah semua aktivitas dipulihkan (onCreate + bundle) atau hanya yang ada di bagian atas tumpukan (terlihat oleh pengguna)?
Markus
1
Semua aktivitas dalam aplikasi berjalan dalam satu proses. Jadi ketika sebuah proses dimatikan semua aktivitas tidak peduli 5 atau 10 akan dibunuh yaitu, dimulai kembali. Restart akan menyebabkan aplikasi Anda untuk memulai dari awal tidak ada status yang disimpan ..
Vinay
1
Hampir benar, tetapi tidak untuk versi 2.2 ke atas. Lihat UPDATE saya di bagian atas halaman.
Tandai
1
Tidak, ini tidak benar dan tidak pernah benar. Ini membingungkan berdasarkan dokumen, tetapi lihat: stackoverflow.com/questions/7536988/…
greg7gkb
2
@JJPA Android tidak dapat menghancurkan Aktivitas tunggal untuk mendapatkan kembali memori, ini hanya menghancurkan proses. Lihat jawaban dari Dianne Hackbor, anggota tim inti Android yang terlibat dalam implementasi "out of memory killer": stackoverflow.com/a/7576275/1290264 .
bcorso