Biasanya, setiap aplikasi Android berjalan dalam proses Linux-nya sendiri. Proses ini dibuat untuk aplikasi jika beberapa kodenya harus berjalan dan tetap berjalan hingga sistem perlu mendapatkan kembali memorinya untuk digunakan oleh aplikasi lain dan tidak lagi diperlukan.
Fitur yang tidak biasa dan mendasar dari Android adalah bahwa masa aktif proses aplikasi tidak dikontrol langsung oleh aplikasi itu sendiri. Sebaliknya, hal ini 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 menghentikan proses aplikasi saat sedang melakukan pekerjaan penting.
Contoh umum bug siklus proses adalah
BroadcastReceiver
yang memulai thread saat
menerima Intent
dalam metode
BroadcastReceiver.onReceive()
-nya, lalu kembali dari fungsi. Setelah kembali, sistem
akan menganggap BroadcastReceiver
tidak lagi aktif, dan proses
hostingnya tidak lagi diperlukan, 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 berjalan dalam proses tersebut. Solusi untuk masalah ini
biasanya adalah menjadwalkan JobService
dari BroadcastReceiver
sehingga
sistem mengetahui bahwa ada pekerjaan aktif yang terjadi dalam proses tersebut.
Untuk menentukan proses mana yang akan dihentikan saat memori hampir habis, Android menempatkan setiap proses ke dalam hierarki kepentingan berdasarkan komponen yang berjalan di dalamnya dan status komponen tersebut. Menurut urutan kepentingannya, jenis proses ini adalah:
- Proses latar depan adalah proses 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 dianggap berada di latar depan jika salah satu
kondisi berikut terpenuhi:
- Proses menjalankan
Activity
di bagian atas layar yang berinteraksi dengan pengguna (metodeonResume()
-nya telah dipanggil). - Proses memiliki
BroadcastReceiver
yang sedang berjalan (metodeBroadcastReceiver.onReceive()
-nya berjalan). - Proses memiliki
Service
yang sedang menjalankan kode di salah satu callback-nya (Service.onCreate()
,Service.onStart()
, atauService.onDestroy()
).
- Proses menjalankan
- Proses yang terlihat melakukan pekerjaan yang saat ini diketahui oleh pengguna,
sehingga mengakhiri proses tersebut akan memiliki dampak negatif yang nyata terhadap pengalaman pengguna. Proses dianggap
terlihat dalam kondisi berikut:
- Proses menjalankan
Activity
yang dapat dilihat oleh pengguna di layar, tetapi tidak di latar depan (metodeonPause()
-nya telah dipanggil). Hal ini mungkin terjadi, misalnya, jikaActivity
latar depan ditampilkan sebagai dialog yang memungkinkanActivity
sebelumnya terlihat di belakangnya. - Proses memiliki
Service
yang berjalan sebagai layanan latar depan, melaluiService.startForeground()
(yang meminta sistem memperlakukan layanan sebagai sesuatu yang diketahui pengguna, atau pada dasarnya seolah-olah terlihat). - Layanan ini menghosting layanan yang digunakan sistem untuk fitur tertentu yang diketahui pengguna, seperti wallpaper animasi atau layanan metode input.
Jumlah proses yang berjalan pada sistem ini kurang dibatasi daripada proses latar depan, tetapi masih relatif terkendali. Proses ini dianggap sangat penting dan tidak dihentikan kecuali jika diperlukan untuk menjaga semua proses latar depan tetap berjalan.
- Proses menjalankan
- Proses layanan adalah proses yang menyimpan
Service
yang telah dimulai dengan metodestartService()
. Meskipun proses ini tidak langsung terlihat oleh pengguna, proses tersebut umumnya melakukan hal-hal yang penting bagi pengguna (seperti upload atau download data jaringan latar belakang), sehingga sistem selalu membuat proses tersebut berjalan kecuali jika tidak ada cukup memori untuk mempertahankan semua proses latar depan dan yang terlihat.Layanan yang telah berjalan lama (misalnya, 30 menit atau lebih) mungkin didemosikan menjadi penting agar prosesnya dapat diteruskan ke daftar yang di-cache.
Proses yang perlu dijalankan dalam jangka waktu lama dapat dibuat dengan
setForeground
. Jika merupakan proses berkala yang memerlukan waktu eksekusi yang ketat, proses tersebut dapat dijadwalkan melaluiAlarmManager
. Untuk informasi selengkapnya, lihat Dukungan untuk pekerja yang berjalan lama. Hal ini membantu menghindari situasi saat layanan yang berjalan lama yang menggunakan resource yang berlebihan, misalnya, dengan kebocoran memori, mencegah sistem memberikan pengalaman pengguna yang baik. - Proses yang tersimpan di dalam cache adalah salah satu yang saat ini tidak diperlukan, sehingga
sistem bebas untuk menghentikannya kapan saja saat resource seperti memori diperlukan di tempat lain. Dalam sistem yang berperilaku
normal, proses ini adalah satu-satunya proses yang terlibat dalam pengelolaan resource.
Sistem yang berjalan dengan baik memiliki beberapa proses cache yang selalu tersedia, untuk peralihan yang efisien antar-aplikasi, dan secara teratur menghentikan aplikasi yang di-cache sesuai kebutuhan. Hanya dalam situasi yang sangat kritis, sistem akan sampai pada tahap di mana semua proses yang disimpan dalam cache akan dihentikan dan harus mulai mengakhiri proses layanan.
Karena proses yang di-cache dapat dihentikan oleh sistem kapan saja, aplikasi harus menghentikan semua pekerjaan saat dalam status di-cache. Jika pekerjaan penting bagi pengguna harus dilakukan oleh aplikasi, aplikasi harus menggunakan salah satu API di atas untuk menjalankan pekerjaan dari status proses aktif.
Proses yang di-cache sering kali menyimpan satu atau beberapa instance
Activity
yang saat ini tidak terlihat oleh pengguna (metodeonStop()
-nya telah dipanggil dan ditampilkan). Selama siklus prosesActivity
diterapkan dengan benar saat sistem menghentikan proses tersebut, hal ini tidak akan memengaruhi pengalaman pengguna saat kembali ke aplikasi tersebut. Aplikasi dapat memulihkan status yang disimpan sebelumnya saat aktivitas terkait dibuat ulang dalam proses baru. Perhatikan bahwaonDestroy()
tidak dijamin akan dipanggil jika proses dihentikan oleh sistem. Untuk detail selengkapnya, lihatActivity
.Mulai Android 13, proses aplikasi mungkin menerima waktu eksekusi terbatas atau tidak ada hingga memasuki salah satu status siklus proses aktif di atas.
Proses yang di-cache disimpan dalam daftar. Kebijakan pengurutan yang tepat untuk daftar ini adalah detail implementasi platform. Umumnya, sistem ini mencoba mempertahankan proses yang lebih berguna, seperti yang menghosting aplikasi beranda pengguna atau aktivitas terakhir yang dilihat pengguna, sebelum jenis proses lainnya. Kebijakan lain untuk menghentikan proses juga dapat diterapkan, seperti menetapkan batas penggunaan pada jumlah proses yang diizinkan atau membatasi jumlah waktu proses dapat terus-menerus disimpan di dalam cache.
Hanya ada beberapa proses seperti itu di dalam sistem, dan proses tersebut hanya dihentikan sebagai upaya terakhir jika memori terlalu sedikit sehingga proses ini tidak dapat terus berjalan. Umumnya, jika hal ini terjadi, perangkat telah mencapai status paging memori, sehingga tindakan ini diperlukan untuk menjaga antarmuka pengguna tetap responsif.
Saat memutuskan cara mengklasifikasikan proses, sistem 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 mengetahui detail selengkapnya tentang cara
setiap komponen ini berkontribusi pada keseluruhan siklus proses dan
aplikasi.
Prioritas proses juga dapat ditingkatkan berdasarkan dependensi lain
yang 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.