Ringkasan tugas latar belakang

Aplikasi sering kali perlu melakukan lebih dari satu hal sekaligus. Android API menyediakan banyak cara berbeda untuk memungkinkan Anda melakukannya. Memilih opsi yang tepat sangat penting; sebuah opsi mungkin tepat untuk satu situasi, tetapi sangat salah untuk situasi lainnya. Memilih API yang salah dapat menurunkan performa aplikasi atau efisiensi resource, yang dapat menghabiskan baterai dan menurunkan performa perangkat pengguna secara keseluruhan. Dalam beberapa kasus, memilih pendekatan yang salah dapat mencegah aplikasi Anda tercantum di Play Store.

Dokumen ini menjelaskan berbagai opsi yang tersedia untuk Anda, dan membantu Anda memilih opsi yang tepat untuk situasi Anda.

Terminologi

Beberapa istilah penting yang terkait dengan tugas latar belakang mungkin digunakan dengan beberapa cara yang bertentangan. Oleh karena itu, penting untuk menentukan istilah kami.

Jika aplikasi berjalan di latar belakang, sistem akan menerapkan sejumlah pembatasan pada aplikasi tersebut. (Misalnya, dalam sebagian besar kasus, aplikasi di latar belakang tidak dapat meluncurkan layanan latar depan.)

Untuk tujuan dokumen ini, kami akan menggunakan istilah "tugas" yang berarti operasi yang dilakukan aplikasi di luar alur kerja utamanya. Untuk memastikan kesamaan pemahaman, kami telah memasukkannya ke dalam tiga kategori utama jenis tugas: pekerjaan asinkron, API penjadwalan tugas, dan layanan latar depan.

Memilih opsi yang tepat

Dalam sebagian besar skenario, Anda dapat mengetahui API yang tepat untuk digunakan untuk tugas dengan mengetahui kategori (pekerjaan asinkron, API penjadwalan tugas, atau layanan latar depan) yang menjadi bagian dari tugas.

Jika masih ragu, Anda dapat menggunakan diagram alur yang kami sediakan yang memberikan lebih banyak nuansa pada keputusan. Setiap opsi ini dijelaskan secara lebih mendetail nanti dalam dokumen ini.

Ada dua skenario utama yang perlu dipertimbangkan untuk tugas latar belakang:

Kedua skenario ini memiliki hierarki keputusannya sendiri.

Pekerjaan asinkron

Dalam banyak kasus, aplikasi hanya perlu melakukan operasi serentak saat berjalan di latar depan. Misalnya, aplikasi mungkin perlu melakukan penghitungan yang memakan waktu lama. Jika melakukan penghitungan pada UI thread, pengguna tidak akan dapat berinteraksi dengan aplikasi hingga penghitungan selesai; hal ini dapat menyebabkan error ANR. Dalam kasus seperti ini, aplikasi harus menggunakan opsi pekerjaan asinkron.

Opsi pekerjaan asinkron umum mencakup coroutine Kotlin dan thread Java; Anda dapat menemukan informasi selengkapnya dalam dokumentasi pekerjaan asinkron. Penting untuk diperhatikan bahwa tidak seperti API tugas latar belakang, pekerjaan asinkron tidak dijamin akan selesai jika aplikasi berhenti berada dalam tahap siklus proses yang valid (misalnya, jika aplikasi keluar dari latar depan).

API penjadwalan tugas

API penjadwalan tugas adalah opsi yang lebih fleksibel saat Anda perlu melakukan tugas yang perlu dilanjutkan meskipun pengguna keluar dari aplikasi. Dalam sebagian besar kasus, opsi terbaik untuk menjalankan tugas latar belakang adalah menggunakan WorkManager, meskipun dalam beberapa kasus mungkin lebih tepat untuk menggunakan API JobScheduler platform.

WorkManager adalah library canggih yang memungkinkan Anda menyiapkan tugas sederhana atau rumit sesuai kebutuhan. Anda dapat menggunakan WorkManager untuk menjadwalkan tugas agar berjalan pada waktu tertentu, atau menentukan kondisi saat tugas harus berjalan. Anda bahkan dapat menyiapkan rantai tugas, sehingga setiap tugas berjalan secara bergantian, meneruskan hasilnya ke tugas berikutnya. Untuk memahami semua opsi yang tersedia, baca daftar fitur WorkManager.

Beberapa skenario yang paling umum untuk tugas latar belakang meliputi:

  • Mengambil data dari server secara berkala
  • Mengambil data sensor (misalnya, data penghitung langkah)
  • Mendapatkan data lokasi berkala (Anda harus diberi izin ACCESS_BACKGROUND_LOCATION di Android 10 atau yang lebih baru)
  • Mengupload konten berdasarkan pemicu konten, seperti foto yang dibuat oleh kamera

Layanan latar depan

Layanan latar depan menawarkan cara yang efektif untuk segera menjalankan tugas yang tidak boleh terganggu. Namun, layanan latar depan berpotensi menimbulkan beban berat pada perangkat, dan terkadang memiliki implikasi privasi dan keamanan. Karena alasan ini, sistem menerapkan banyak batasan pada cara dan waktu aplikasi dapat menggunakan layanan latar depan. Misalnya, layanan latar depan harus terlihat oleh pengguna, dan pada umumnya aplikasi tidak dapat meluncurkan layanan latar depan saat aplikasi berada di latar belakang. Untuk mengetahui informasi selengkapnya, lihat dokumentasi layanan latar depan.

Ada dua metode untuk membuat layanan latar depan. Anda dapat mendeklarasikan Service Anda sendiri dan menentukan bahwa layanan tersebut adalah layanan latar depan dengan memanggil Service.startForeground(). Atau, Anda dapat menggunakan WorkManager untuk membuat layanan latar depan, seperti yang dibahas dalam dukungan untuk pekerja yang berjalan lama. Namun, penting untuk diketahui bahwa layanan latar depan yang dibuat oleh WorkManager harus mematuhi semua batasan yang sama seperti layanan latar depan lainnya. WorkManager hanya menyediakan beberapa API praktis untuk mempermudah pembuatan layanan latar depan.

API Alternatif

Sistem ini menawarkan API alternatif yang dirancang untuk berperforma lebih baik untuk kasus penggunaan yang lebih spesifik. Jika ada API alternatif untuk kasus penggunaan Anda, sebaiknya gunakan API tersebut, bukan layanan latar depan, karena API tersebut akan membantu aplikasi Anda berperforma lebih baik. Dokumentasi jenis layanan latar depan mencatat saat ada API alternatif yang baik untuk digunakan, bukan jenis layanan latar depan tertentu.

Beberapa skenario paling umum untuk menggunakan API alternatif adalah:

Tugas yang dimulai oleh pengguna

Diagram alir yang menunjukkan cara memilih API yang sesuai. Diagram ini
  meringkas materi di bagian 'Tugas yang dimulai oleh pengguna'.
Gambar 1: Cara memilih API yang tepat untuk menjalankan tugas latar belakang yang dimulai pengguna.

Jika aplikasi perlu melakukan tugas latar belakang, dan operasi dimulai oleh pengguna saat aplikasi terlihat, jawab pertanyaan ini untuk menemukan pendekatan yang tepat.

Apakah tugas harus terus berjalan saat aplikasi berada di latar belakang?

Jika tugas tidak perlu terus berjalan saat aplikasi berada di latar belakang, Anda harus menggunakan pekerjaan asinkron. Ada beberapa opsi untuk melakukan pekerjaan asinkron. Hal yang penting untuk dipahami adalah semua opsi ini berhenti beroperasi jika aplikasi beralih ke latar belakang. (Proses ini juga akan berhenti jika aplikasi dinonaktifkan.) Misalnya, aplikasi media sosial mungkin ingin memuat ulang feed kontennya, tetapi tidak perlu menyelesaikan operasi jika pengguna keluar dari layar.

Apakah akan ada pengalaman pengguna yang buruk jika tugas ditangguhkan atau terganggu?

Penting untuk mempertimbangkan apakah pengalaman pengguna akan terganggu jika tugas ditunda atau dibatalkan. Misalnya, jika aplikasi perlu mengupdate asetnya, pengguna mungkin tidak menyadari apakah operasi terjadi langsung, atau di tengah malam saat perangkat sedang diisi ulang. Dalam kasus seperti ini, Anda harus menggunakan opsi pekerjaan latar belakang.

Apakah tugasnya singkat dan penting?

Jika tugas tidak dapat ditunda dan akan selesai dengan cepat, Anda dapat menggunakan layanan latar depan dengan jenis shortService. Layanan ini lebih mudah dibuat daripada layanan latar depan lainnya, dan tidak memerlukan izin sebanyak itu. Namun, layanan singkat harus selesai dalam waktu tiga menit.

Apakah ada API alternatif hanya untuk tujuan ini?

Jika tugas tidak terlihat oleh pengguna, solusi yang tepat mungkin adalah menggunakan layanan latar depan. Layanan ini berjalan terus-menerus setelah dimulai, sehingga merupakan pilihan yang baik jika mengganggu tugas akan memberikan pengalaman pengguna yang buruk. Misalnya, aplikasi pelacakan olahraga dapat menggunakan sensor lokasi untuk memungkinkan pengguna merekam rute joging mereka di peta. Sebaiknya jangan lakukan hal ini dengan opsi pekerjaan latar belakang, karena jika tugas dijeda, pelacakan akan segera berhenti. Dalam situasi seperti ini, layanan latar depan adalah yang paling tepat.

Namun, karena layanan latar depan berpotensi menggunakan banyak resource perangkat, sistem menerapkan banyak batasan terkait kapan dan bagaimana layanan tersebut dapat digunakan. Dalam banyak kasus, Anda dapat menggunakan API alternatif yang menangani tugas untuk Anda dengan lebih sedikit masalah, bukan menggunakan layanan latar depan. Misalnya, jika aplikasi Anda perlu mengambil tindakan saat pengguna tiba di lokasi tertentu, opsi terbaik Anda adalah menggunakan API pembatasan wilayah, bukan melacak lokasi pengguna dengan layanan latar depan.

Tugas sebagai respons terhadap peristiwa

Diagram alir yang menunjukkan cara memilih API yang sesuai. Diagram ini
  merangkum materi di bagian 'Tugas sebagai respons terhadap peristiwa'.
Gambar 2: Cara memilih API yang tepat untuk menjalankan tugas latar belakang yang dipicu peristiwa.

Terkadang aplikasi perlu melakukan pekerjaan latar belakang sebagai respons terhadap pemicu, seperti:

Ini mungkin pemicu eksternal (seperti pesan FCM), atau mungkin sebagai respons terhadap alarm yang disetel oleh aplikasi itu sendiri. Misalnya, game mungkin menerima pesan FCM yang memintanya untuk mengupdate beberapa aset.

Jika Anda dapat memastikan bahwa tugas akan selesai dalam beberapa detik, gunakan pekerjaan asinkron untuk melakukan tugas. Sistem akan memberi aplikasi Anda beberapa detik untuk melakukan tugas tersebut, meskipun aplikasi Anda berada di latar belakang.

Jika tugas akan memerlukan waktu lebih dari beberapa detik, sebaiknya mulai layanan latar depan untuk menangani tugas. Bahkan, meskipun aplikasi Anda saat ini berada di latar belakang, aplikasi tersebut mungkin diizinkan untuk memulai layanan latar depan, jika tugas dipicu oleh pengguna dan termasuk dalam salah satu pengecualian dari batasan mulai latar belakang yang disetujui. Misalnya, jika aplikasi menerima pesan FCM prioritas tinggi, aplikasi diizinkan untuk memulai layanan latar depan meskipun aplikasi berada di latar belakang.

Jika tugas akan memerlukan waktu lebih dari beberapa detik, gunakan API penjadwalan tugas.