Proses dan siklus proses aplikasi

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:

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

  3. 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 (metode onPause()-nya telah dipanggil). Hal ini mungkin terjadi, misalnya, jika Activity latar depan ditampilkan sebagai dialog yang memungkinkan Activity 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 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.

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

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

    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.

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.