Ringkasan tugas latar belakang

Aplikasi sering kali perlu melakukan lebih dari satu hal sekaligus. API Android menyediakan berbagai cara untuk memungkinkan Anda melakukan hal ini. Memilih opsi yang tepat sangat penting; opsi mungkin tepat untuk satu situasi, tetapi sangat salah untuk situasi lainnya. Memilih API yang salah dapat mengganggu performa atau efisiensi resource aplikasi, yang dapat menguras daya 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 terkait tugas latar belakang mungkin digunakan dalam beberapa cara yang kontradiktif. Oleh karena itu, penting untuk mendefinisikan 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 keselarasan dalam pemahaman, kami telah memasukkannya ke dalam tiga kategori utama jenis tugas: pekerjaan asinkron, API penjadwalan tugas, dan layanan latar depan.

Pilih opsi yang tepat

Di sebagian besar skenario, Anda dapat mengetahui API yang tepat untuk digunakan bagi tugas Anda dengan menentukan kategori (pekerjaan asinkron, API penjadwalan tugas, atau layanan latar depan) tempat tugas berada.

Jika masih tidak yakin, Anda dapat menggunakan diagram alir yang kami sediakan yang lebih memberi nuansa pada keputusan tersebut. Setiap opsi ini akan dijelaskan secara lebih mendetail nanti dalam dokumen ini.

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

Kedua skenario ini memiliki pohon 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. Jika penghitungan dilakukan di 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 harus melanjutkan meskipun pengguna keluar dari aplikasi. Pada sebagian besar kasus, opsi terbaik untuk menjalankan tugas latar belakang adalah menggunakan WorkManager, meskipun dalam beberapa kasus penggunaan JobScheduler API platform mungkin lebih tepat.

WorkManager adalah library canggih yang memungkinkan Anda menyiapkan tugas sederhana atau rumit sesuai kebutuhan. Anda dapat menggunakan WorkManager untuk menjadwalkan tugas yang akan dijalankan pada waktu tertentu, atau menentukan kondisi kapan tugas harus dijalankan. 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 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 tinggi)
  • 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 tanpa gangguan. Namun, layanan latar depan berpotensi membebani perangkat, dan terkadang memiliki implikasi privasi serta keamanan. Karena alasan ini, sistem memberlakukan banyak pembatasan terkait cara dan waktu aplikasi dapat menggunakan layanan latar depan. Misalnya, layanan latar depan harus terlihat oleh pengguna, dan umumnya, aplikasi tidak dapat meluncurkan layanan latar depan saat aplikasi berada di latar belakang. Untuk informasi selengkapnya, lihat dokumentasi layanan latar depan.

Ada dua metode untuk membuat layanan latar depan. Anda dapat mendeklarasikan Service Anda sendiri dan menentukan bahwa layanannya merupakan 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 menawarkan API alternatif yang didesain agar 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 akan membantu aplikasi 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 tepat. Diagram ini
  merangkum 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 tetap 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 sejumlah opsi untuk melakukan pekerjaan asinkron. Hal yang penting untuk dipahami adalah bahwa semua opsi ini akan berhenti beroperasi jika aplikasi beralih ke latar belakang. (Aktivitas ini juga akan berhenti jika aplikasi dimatikan.) Misalnya, aplikasi media sosial mungkin ingin memuat ulang feed kontennya, tetapi tidak perlu menyelesaikan operasi jika pengguna meninggalkan layar.

Apakah akan ada pengalaman pengguna yang buruk jika tugas ditunda atau diinterupsi?

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 langsung terjadi, atau di tengah malam saat perangkat sedang diisi ulang. Dalam kasus seperti ini, Anda harus menggunakan opsi pekerjaan latar belakang.

Apakah ini tugas yang 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 banyak izin. 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 dengan menggunakan layanan latar depan. Layanan ini berjalan terus-menerus setelah dimulai, sehingga merupakan pilihan yang baik ketika mengganggu tugas akan memberikan pengalaman pengguna yang buruk. Misalnya, aplikasi pemantau olahraga mungkin menggunakan sensor lokasi untuk memungkinkan pengguna merekam rute joging di peta. Anda tidak ingin melakukan ini dengan opsi pekerjaan latar belakang, karena jika tugas dijeda, pelacakan akan segera berhenti. Dalam situasi seperti ini, layanan latar depan adalah hal yang paling masuk akal.

Namun, karena layanan latar depan berpotensi menggunakan banyak resource perangkat, sistem menerapkan banyak pembatasan terkait waktu dan cara penggunaannya. Dalam banyak kasus, daripada menggunakan layanan latar depan, Anda dapat menggunakan API alternatif yang menangani tugas untuk Anda dengan lebih sedikit masalah. 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 tepat. 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:

Pemicu ini dapat berupa pemicu eksternal (seperti pesan FCM), atau mungkin sebagai respons terhadap alarm yang disetel oleh aplikasi itu sendiri. Misalnya, game mungkin menerima pesan FCM yang meminta game tersebut untuk memperbarui beberapa aset.

Jika Anda yakin tugas akan selesai dalam beberapa detik, gunakan pekerjaan asinkron untuk melakukan tugas tersebut. Sistem akan mengizinkan aplikasi Anda beberapa detik untuk melakukan tugas tersebut, meskipun aplikasi berada di latar belakang.

Jika tugas memerlukan waktu lebih dari beberapa detik, mungkin perlu memulai 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 tersebut dipicu oleh pengguna dan termasuk dalam salah satu pengecualian dari pembatasan memulai latar belakang yang disetujui. Misalnya, jika menerima pesan FCM prioritas tinggi, aplikasi diizinkan untuk memulai layanan latar depan meskipun aplikasi berada di latar belakang.

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