Proses dan Siklus Proses Aplikasi

Biasanya, setiap aplikasi Android berjalan dalam proses Linux-nya sendiri. Proses ini dibuat untuk aplikasi jika beberapa kodenya harus dijalankan, dan akan tetap berjalan hingga kodenya tidak lagi diperlukan serta sistem perlu mendapatkan kembali memorinya untuk digunakan oleh aplikasi lain.

Fitur yang tidak biasa dan mendasar dari Android adalah bahwa masa aktif proses aplikasi tidak dikontrol langsung oleh aplikasi itu sendiri. Melainkan ditentukan oleh sistem melalui kombinasi beberapa bagian aplikasi yang diketahui oleh sistem sedang berjalan, seberapa penting hal-hal tersebut bagi pengguna, dan seberapa banyak memori keseluruhan yang tersedia dalam sistem.

Penting bagi developer aplikasi untuk memahami bagaimana komponen aplikasi yang berbeda (khususnya Activity, Service, dan BroadcastReceiver) memengaruhi masa aktif proses aplikasi. Tidak menggunakan komponen ini dengan benar dapat menyebabkan sistem mengakhiri proses aplikasi saat sedang melakukan pekerjaan penting.

Contoh umum dari bug siklus proses adalah BroadcastReceiver yang memulai thread saat menerima Intent di dalam metode BroadcastReceiver.onReceive()-nya, lalu kembali dari fungsi. Setelah kembali, sistem menganggap BroadcastReceiver tidak lagi aktif, dan dengan demikian, proses hosting tidak diperlukan lagi (kecuali jika komponen aplikasi lainnya aktif di dalamnya). Jadi, sistem dapat mengakhiri proses kapan saja untuk mendapatkan kembali memori, dan dengan melakukannya, sistem akan menghentikan thread yang sedang dalam proses. Solusi untuk masalah ini biasanya adalah menjadwalkan JobService dari BroadcastReceiver, sehingga sistem mengetahui bahwa masih ada pekerjaan aktif yang sedang dilakukan dalam proses tersebut.

Untuk menentukan proses mana yang harus diakhiri saat kekurangan memori, Android menempatkan setiap proses ke dalam "hierarki kepentingan" berdasarkan komponen yang berjalan di dalamnya dan status komponen tersebut. Jenis proses ini adalah (menurut urutan kepentingannya):

  1. Proses latar depan adalah salah satu yang diperlukan untuk hal yang sedang dilakukan pengguna. Berbagai komponen aplikasi dapat menyebabkan proses di dalamnya dianggap sebagai latar depan dengan cara yang berbeda. Proses akan dianggap berada di latar depan jika salah satu kondisi berikut terpenuhi:
  2. Hanya ada beberapa proses seperti itu di dalam sistem, dan proses tersebut hanya akan diakhiri sebagai upaya terakhir jika memori terlalu sedikit sehingga proses ini tidak dapat terus berjalan. Umumnya, pada tahap ini, perangkat telah mencapai status paging, sehingga tindakan ini diperlukan untuk menjaga antarmuka pengguna tetap responsif.

  3. Proses yang terlihat adalah melakukan pekerjaan yang saat ini diketahui oleh pengguna, sehingga mengakhiri proses tersebut akan memiliki dampak negatif yang nyata terhadap pengalaman pengguna. Suatu proses dianggap terlihat dalam kondisi berikut:
    • Proses menjalankan Activity yang dapat dilihat oleh pengguna di layar, tetapi tidak di latar depan (metode onPause()-nya telah dipanggil). Hal ini dapat terjadi, misalnya, jika Aktivitas latar depan ditampilkan sebagai dialog yang memungkinkan Aktivitas sebelumnya terlihat di belakangnya.
    • Proses memiliki Service yang berjalan sebagai layanan latar depan, melalui Service.startForeground() (yang meminta sistem memperlakukan layanan sebagai sesuatu yang diketahui pengguna, atau terlihat oleh pengguna).
    • Menghosting layanan yang digunakan sistem untuk fitur tertentu yang diketahui pengguna, seperti wallpaper animasi, layanan metode masukan, dll.

    Jumlah proses yang berjalan pada sistem ini kurang dibatasi daripada proses latar depan, tetapi masih relatif terkendali. Proses ini dianggap sangat penting dan tidak akan diakhiri kecuali jika diperlukan untuk menjaga semua proses latar depan tetap berjalan.

  4. Proses layanan adalah salah satu yang menyimpan Service yang telah dimulai dengan metode startService(). Meskipun proses ini tidak langsung terlihat oleh pengguna, proses ini umumnya melakukan hal-hal yang diperlukan pengguna (seperti upload atau download data jaringan latar belakang), sehingga sistem akan selalu menjaga proses tersebut tetap berjalan kecuali memori tidak cukup untuk mempertahankan semua latar depan dan proses yang terlihat.

    Layanan yang telah berjalan lama (misalnya, 30 menit atau lebih) dapat didemosikan menjadi penting agar prosesnya dapat diteruskan ke daftar LRU yang tersimpan dalam cache yang dijelaskan berikutnya. Hal ini membantu menghindari situasi saat layanan yang berjalan sangat lama dengan kebocoran memori atau masalah lain menggunakan begitu banyak RAM sehingga mencegah sistem menggunakan proses cache yang efektif.

  5. Proses yang tersimpan di dalam cache adalah salah satu yang saat ini tidak diperlukan, sehingga sistem bebas untuk menghentikannya kapan saja saat memori diperlukan di tempat lain. Dalam sistem yang berperilaku normal, proses ini adalah satu-satunya proses yang terlibat dalam manajemen memori: sistem yang berjalan dengan baik akan memiliki beberapa proses cache yang selalu tersedia (untuk peralihan antara aplikasi yang lebih efisien) dan secara teratur mengakhiri proses yang paling lama sesuai kebutuhan. Hanya dalam situasi yang sangat kritis (dan yang tidak diinginkan) sistem akan sampai pada tahap di mana semua proses yang disimpan dalam cache akan dihentikan dan harus mulai mengakhiri proses layanan.

    Proses ini kerap berisi satu atau beberapa instance Activity yang saat ini tidak dapat dilihat oleh pengguna (metode onStop() telah dipanggil dan ditampilkan). Jika sistem menerapkan siklus proses Aktivitas dengan benar (lihat Activity untuk detail selengkapnya), ketika sistem mengakhiri proses tersebut tidak akan memengaruhi pengalaman pengguna saat kembali ke aplikasi: sistem dapat memulihkan status yang disimpan sebelumnya setelah aktivitas terkait dibuat kembali dalam proses baru.

    Proses ini disimpan dalam daftar pseudo-LRU, di mana proses terakhir pada daftar adalah yang pertama kali diakhiri guna mendapatkan kembali memori. Kebijakan yang tepat untuk mengurutkan pada daftar ini adalah detail implementasi platform, tetapi umumnya akan mencoba untuk mempertahankan proses yang lebih berguna (proses menghosting aplikasi beranda pengguna, aktivitas terakhir yang dilihat, dll) sebelum jenis proses lainnya. Kebijakan lain untuk mengakhiri proses juga dapat diterapkan: batas penggunaan pada jumlah proses yang diizinkan, batas jumlah waktu proses dapat terus-menerus disimpan di dalam cache, dll.

Saat memutuskan cara mengklasifikasikan proses, sistem akan mendasarkan keputusannya pada tingkat yang paling penting yang ditemukan di antara semua komponen yang saat ini aktif dalam proses. Lihat dokumentasi Activity, Service, dan BroadcastReceiver untuk detail selengkapnya tentang bagaimana masing-masing komponen ini berkontribusi pada keseluruhan siklus proses suatu proses. Dokumentasi untuk masing-masing class tersebut dijelaskan secara lebih mendetail bagaimana dokumentasi tersebut memengaruhi keseluruhan siklus proses aplikasi.

Prioritas proses juga dapat ditingkatkan berdasarkan dependensi lain yang harus dimiliki proses tersebut. Misalnya, jika proses A terikat pada Service dengan flag Context.BIND_AUTO_CREATE atau menggunakan ContentProvider dalam proses B, maka klasifikasi proses B akan selalu setidaknya sama pentingnya dengan proses A.