Siklus hidup objek statis Android

101

Saya membuat aplikasi pencarian acara, kami menetapkan kriteria pencarian dari satu layar mengisi di layar lain kemudian pengguna dapat mengedit kriteria pencarian dari layar ke-3 dan pergi ke layar ke-4.

Untuk mencapai tugas di atas saya menggunakan objek statis yang mengingat nilai-nilai di sekitar aplikasi dan saya tidak perlu melakukan hal tambahan.

Tetapi saya takut jika tentang siklus hidup objek statis di android jika memori rendah ditemukan android menghapus objek statis ???

Karena android mendukung multi tasking, jika pengguna beralih ke aplikasi lain dan ketika pengguna kembali aplikasi mulai bertingkah gila, apakah objek statis dihapus ketika itu multi tugas ??? ada ide ?? dan juga menyarankan memegang objek statis melalui metode tunggal adalah pendekatan yang lebih baik ???

d-man
sumber

Jawaban:

238

Mari kita mulai dengan sedikit latar belakang: Apa yang terjadi saat Anda memulai aplikasi?
OS memulai proses dan memberinya id proses unik dan mengalokasikan tabel proses. Proses memulai instance DVM (Dalvik VM); Setiap aplikasi berjalan di dalam DVM.
DVM mengelola pembongkaran pemuatan kelas, siklus hidup instance, GC, dll.

Masa pakai variabel statis: Variabel statis muncul saat kelas dimuat oleh JVM dan mati saat kelas dibongkar.

Jadi, jika Anda membuat aplikasi android dan menginisialisasi variabel statis, variabel tersebut akan tetap berada di JVM hingga salah satu hal berikut terjadi:
1. kelas dibongkar
2. JVM dimatikan
3. proses mati

Perhatikan bahwa nilai variabel statis akan tetap ada saat Anda beralih ke aktivitas berbeda dari aplikasi lain dan tidak satu pun dari ketiga di atas yang terjadi. Jika salah satu dari tiga di atas terjadi, statis akan kehilangan nilainya.

Anda dapat mengujinya dengan beberapa baris kode:

  1. cetak statis yang tidak diinisialisasi di onCreate aktivitas Anda -> harus mencetak null
  2. menginisialisasi statis. cetak itu -> nilainya bukan nol
  3. Tekan tombol kembali dan pergi ke layar beranda. Catatan: Layar utama adalah aktivitas lain.
  4. Luncurkan aktivitas Anda lagi -> variabel statis bukan nol
  5. Hentikan proses aplikasi Anda dari DDMS (tombol berhenti di jendela perangkat).
  6. Mulai ulang aktivitas Anda -> statis akan memiliki nilai nol.

Semoga membantu.

Samuh
sumber
1
Saya ingin tahu mengapa saya kehilangan nilai bidang saya di objek aplikasi jika tidak statis ketika saya memulai aktivitas baru misalnya saya mendeklarasikan halaman saat ini variabel dalam objek aplikasi dan nilainya selalu kembali ke nol ketika saya membuka aktivitas baru
Mohammed Subhi Sheikh Quroush
ketika saya memanggil super.onRestoreInstanceState (storedInstanceState); Saya kehilangan variabel saya meskipun statis, apa masalahnya?
Mohammed Subhi Sheikh Quroush
1
ini adalah penjelasan yang bagus (jadi tidak -1) tapi ini agak tidak penting: OP bertanya secara eksplisit tentang "situasi memori rendah" (alasan yang sama mengapa saya di sini), di mana sejauh yang saya tahu Os mungkin membunuh VM dan restart nanti dengan parameter yang sama, dan kasus ini ( JIKA hal itu nyata) tidak tercakup di sini ...
Rick77
1
@suitianshi Saya rasa kita dapat menginisialisasi instance statis di Application.onCreate, karena meskipun aplikasi kita masuk ke latar belakang dan prosesnya terhenti, segera setelah kita kembali ke aplikasi kita, kelas Aplikasi akan dibuatkan dan menyebutnya metode siklus hidup yang sesuai lagi! meskipun saya memerlukan konfirmasi tentang ini, saya bertanya-tanya apakah mungkin ada skenario di mana instance statis yang diinisialisasi di Application.onCreate kehilangan nilainya?
Sarthak Mittal
1
Apa yang saya lewatkan di sini adalah penjelasan untuk "1. kelas dibongkar" - kapan ini akan terjadi? Akankah JVM membongkar kelas jika memori hampir habis?
Stoefln
16

Nah, pola Singleton juga didasarkan pada penggunaan variabel statis jadi sebenarnya Anda akan berada di posisi yang sama. Meskipun pendekatan statis dapat bekerja di sebagian besar waktu, mungkin terjadi bahwa dalam beberapa kasus ketika memori penuh dan aktivitas lain mengambil latar depan sebelum aplikasi Anda berpindah ke layar berikutnya, proses aktivitas Anda dapat dimatikan dan Anda kehilangan nilai statis. Namun Android menawarkan beberapa opsi nilai yang ada di antara status atau mentransmisikannya seperti:

  • menggunakan Intent, Anda bisa meneruskan kriteria pencarian Anda dari aktivitas ke aktivitas (mirip dengan permintaan http web)
  • menggunakan preferensi aplikasi, Anda bisa menyimpan nilai dan mengambilnya kembali dalam aktivitas yang membutuhkannya
  • menggunakan database sqlite Anda dapat menyimpannya dalam tabel dan mengambilnya nanti
  • jika Anda hanya perlu menyimpan status aktivitas sehingga saat dimulai ulang, bidang akan diisi dengan nilai yang dipilih sebelumnya, Anda bisa mengimplementasikan metode aktivitas onSaveInstanceState () - perhatikan bahwa ini tidak disarankan untuk persistensi status di antara aktivitas.

Anda bisa mendapatkan beberapa contoh kode penggunaan preferensi, maksud, dan database sqlite dengan melihat pohon kode sumber aegis-shield di kode google atau di aplikasi Android sumber terbuka lainnya.

r1k0
sumber
6

Setelah beberapa penelitian, ternyata menggunakan Application untuk menyimpan lajang bukanlah ide yang bagus, kecuali jika Anda siap untuk membuatnya kembali:

Jangan simpan data di objek aplikasi

jadi meskipun jawaban yang diterima secara teknis benar, namun tidak memberikan semua informasi.

Seperti yang disarankan tautan di atas, jika Anda benar-benar ingin tetap menggunakan model itu, Anda harus siap memeriksa null dan membuat ulang data, jika memungkinkan.

Rick77
sumber
3

@ r1k0 ada di sini. Menyimpan data dalam bidang statis kelas tidak akan bertahan sendiri di seluruh proses aplikasi yang mematikan dan memulai ulang. Android secara rutin menghentikan proses (menjalankan aplikasi) saat ia membutuhkan memori.

Sesuai dokumen Android: Status aktivitas dan pengeluaran dari memori ,

Sistem tidak pernah membunuh suatu aktivitas secara langsung. Sebaliknya, ini membunuh proses di mana aktivitas berjalan, tidak hanya menghancurkan aktivitas tetapi juga semua hal lain yang berjalan dalam proses tersebut.

Anda dapat menyimpan dan memulihkan status primitif serta objek Serializable dan Parcelable menggunakan metode di bawah ini. Ini secara otomatis dipanggil selama siklus hidup aktivitas normal.

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

Jadi, jika Anda memiliki kelas yang hanya memiliki variabel statis, Anda dapat menyimpan status setiap bidang di onSaveInstanceState () dan memulihkannya di onRestoreInstanceState (). Saat Android menghentikan proses yang menjalankan aplikasi Anda, status variabel Anda akan disimpan, dan saat Android memulihkan aplikasi Anda, nilainya akan dipulihkan dalam memori dengan status yang sama seperti sebelumnya.

eric.mcgregor
sumber