Proses dan siklus proses aplikasi

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:

  1. 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:
  2. 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.

  3. 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 (metode onPause() telah dipanggil). Hal ini mungkin terjadi, misalnya, jika Activity latar depan ditampilkan sebagai dialog yang memungkinkan Activity sebelumnya terlihat di belakangnya.
    • Metode ini memiliki Service yang berjalan sebagai layanan latar depan, melalui Service.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.

  4. Proses layanan adalah proses yang menyimpan Service yang telah dimulai dengan metode startService(). 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 melalui AlarmManager. 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.

  5. 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 (metode onStop()-nya telah dipanggil dan ditampilkan). Asalkan mereka menerapkan siklus proses Activity 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 bahwa onDestroy() tidak dijamin akan dipanggil jika proses dihentikan oleh sistem. Untuk mengetahui detail selengkapnya, lihat Activity.

    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.

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.