Biasanya, setiap aplikasi Android berjalan dalam proses Linux-nya sendiri. Proses ini dibuat untuk aplikasi saat beberapa kodenya perlu dijalankan dan tetap berjalan hingga sistem perlu mendapatkan kembali memorinya untuk digunakan oleh aplikasi lain dan tidak diperlukan lagi.
Fitur Android yang tidak biasa dan mendasar adalah masa aktif proses aplikasi tidak dikontrol secara langsung oleh aplikasi itu sendiri. Sebaliknya, ditentukan oleh sistem melalui kombinasi bagian-bagian aplikasi yang diketahui oleh sistem sedang berjalan, seberapa penting hal-hal ini bagi pengguna, dan berapa banyak memori keseluruhan yang tersedia dalam sistem.
Penting bagi
developer aplikasi memahami pengaruh berbagai komponen aplikasi
(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 dari bug siklus proses adalah
BroadcastReceiver
yang memulai thread saat
menerima Intent
dalam metode BroadcastReceiver.onReceive()
,
lalu kembali dari fungsi tersebut. Setelah ditampilkan, sistem
menganggap BroadcastReceiver
tidak aktif lagi, dan proses
hostingnya tidak lagi diperlukan, kecuali jika komponen aplikasi lain aktif
di dalamnya.
Jadi, sistem dapat menghentikan proses kapan saja untuk mendapatkan kembali memori, dan dengan demikian,
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.
Untuk menentukan proses yang akan dihentikan saat kehabisan memori, Android menempatkan setiap proses ke dalam hierarki kepentingan berdasarkan komponen yang berjalan di dalamnya dan status komponen tersebut. Menurut urutan kepentingan, jenis proses ini adalah:
- Proses latar depan adalah salah satu yang diperlukan untuk
apa yang sedang dilakukan pengguna. Berbagai komponen aplikasi dapat
menyebabkan proses penampungnya dianggap sebagai latar depan dengan cara
yang berbeda. Proses dianggap berada di latar depan jika salah satu
kondisi berikut terpenuhi:
- Fungsi ini menjalankan
Activity
di bagian atas layar yang berinteraksi dengan pengguna (metodeonResume()
telah dipanggil). - Fungsi ini memiliki
BroadcastReceiver
yang sedang berjalan (metodeBroadcastReceiver.onReceive()
-nya sedang dieksekusi). - Fungsi ini memiliki
Service
yang sedang mengeksekusi kode di salah satu callback-nya (Service.onCreate()
,Service.onStart()
, atauService.onDestroy()
).
- Fungsi ini menjalankan
- Proses yang terlihat adalah melakukan pekerjaan yang saat ini diketahui pengguna,
jadi menghentikannya memiliki dampak negatif yang nyata terhadap pengalaman pengguna. Sebuah proses dianggap terlihat dalam kondisi berikut:
- Metode ini menjalankan
Activity
yang terlihat oleh pengguna di layar, tetapi tidak di latar depan (metodeonPause()
telah dipanggil). Hal ini mungkin terjadi, misalnya, jikaActivity
latar depan ditampilkan sebagai dialog yang memungkinkanActivity
sebelumnya terlihat di belakangnya. - Metode ini memiliki
Service
yang berjalan sebagai layanan latar depan, melaluiService.startForeground()
(yang meminta sistem untuk memperlakukan layanan sebagai sesuatu yang diketahui pengguna, atau pada dasarnya seolah-olah terlihat). - Menghosting layanan yang digunakan sistem untuk fitur tertentu yang diketahui pengguna, seperti wallpaper animasi atau layanan metode input.
Jumlah proses ini yang berjalan di sistem tidak terlalu dibatasi dibandingkan proses latar depan, tetapi masih relatif terkendali. Proses ini dianggap sangat penting dan tidak dihentikan kecuali jika hal tersebut diperlukan untuk menjaga semua proses latar depan tetap berjalan.
- Metode ini menjalankan
- Proses layanan adalah proses yang menyimpan
Service
yang telah dimulai dengan metodestartService()
. Meskipun proses ini tidak terlihat langsung oleh pengguna, proses ini umumnya melakukan hal-hal yang penting bagi pengguna (seperti upload atau download data jaringan latar belakang), sehingga sistem selalu membuat proses tersebut berjalan kecuali memori tidak cukup untuk mempertahankan semua proses latar depan dan proses yang terlihat.Layanan yang telah berjalan lama (seperti 30 menit atau lebih) mungkin didemosikan menjadi penting agar prosesnya dapat turun ke daftar yang di-cache.
Proses yang perlu dijalankan dalam jangka waktu yang lama dapat dibuat dengan
setForeground
. Jika proses ini merupakan proses berkala yang memerlukan waktu eksekusi yang ketat, proses tersebut dapat dijadwalkan melaluiAlarmManager
. Untuk informasi selengkapnya, lihat Dukungan untuk pekerja jangka panjang. Hal ini membantu menghindari situasi saat layanan yang berjalan lama menggunakan resource berlebihan, misalnya, dengan membocorkan memori, mencegah sistem memberikan pengalaman pengguna yang baik. - Proses yang disimpan dalam cache adalah salah satu yang saat ini tidak diperlukan, sehingga sistem bebas untuk menghentikannya sesuai kebutuhan ketika resource seperti memori diperlukan di tempat lain. Dalam sistem yang berperilaku normal, ini adalah satu-satunya proses yang terlibat dalam pengelolaan resource.
Sistem yang berjalan dengan baik memiliki beberapa proses cache yang selalu tersedia, untuk peralihan antar-aplikasi yang efisien, dan secara rutin menghentikan aplikasi yang di-cache sesuai kebutuhan. Hanya dalam situasi yang sangat kritis, sistem akan mencapai titik tempat semua proses yang disimpan dalam cache dihentikan dan harus mulai menghentikan proses layanan.
Karena proses yang di-cache dapat dimatikan oleh sistem kapan saja, aplikasi harus menghentikan semua pekerjaan saat dalam status cache. Jika pekerjaan yang penting bagi pengguna harus dilakukan oleh aplikasi, aplikasi harus menggunakan API di atas untuk menjalankan pekerjaan dari status proses aktif.
Proses yang disimpan dalam cache sering kali menampung satu atau beberapa instance
Activity
yang saat ini tidak terlihat oleh pengguna (metodeonStop()
-nya telah dipanggil dan ditampilkan). Asalkan mereka menerapkan siklus prosesActivity
dengan benar saat sistem menghentikan proses tersebut, pengalaman pengguna saat kembali ke aplikasi tersebut tidak akan terpengaruh. Aplikasi dapat memulihkan status yang disimpan sebelumnya saat aktivitas terkait dibuat ulang dalam proses baru. Perlu diketahui bahwaonDestroy()
tidak dijamin akan dipanggil jika proses dihentikan oleh sistem. Untuk mengetahui detail selengkapnya, lihatActivity
.Mulai Android 13, proses aplikasi mungkin menerima waktu eksekusi terbatas atau tidak ada sama sekali hingga memasuki salah satu status siklus proses aktif di atas.
Proses yang disimpan dalam cache disimpan dalam daftar. Kebijakan pengurutan yang tepat untuk daftar ini adalah detail implementasi platform. Biasanya, API ini akan 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 pasti jumlah proses yang diizinkan atau membatasi jumlah waktu suatu proses dapat terus-menerus disimpan di cache.
Hanya ada beberapa proses dalam sistem, dan proses ini hanya dihentikan sebagai upaya terakhir jika memori terlalu rendah sehingga proses ini pun tidak dapat terus berjalan. Umumnya, jika hal ini terjadi, perangkat telah mencapai status memory paging, 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 detail selengkapnya tentang cara
setiap komponen ini berkontribusi pada keseluruhan siklus proses suatu proses dan
aplikasi.
Prioritas proses juga dapat ditingkatkan berdasarkan dependensi lain
yang harus dimiliki proses. Misalnya, jika proses A telah terikat ke
Service
dengan
tanda Context.BIND_AUTO_CREATE
atau menggunakan
ContentProvider
dalam proses B, klasifikasi proses B
selalu sama pentingnya dengan proses A.