Ringkasan tugas latar belakang

Aplikasi sering kali perlu melakukan lebih dari satu hal sekaligus. Android API menyediakan banyak cara berbeda untuk memungkinkan Anda melakukan hal ini. Memilih opsi yang tepat sangatlah penting; suatu opsi mungkin tepat untuk satu situasi, tetapi sangat salah untuk situasi lain. Memilih API yang salah dapat mengganggu performa atau efisiensi resource aplikasi, yang dapat menguras baterai dan menurunkan performa perangkat pengguna secara keseluruhan. Dalam beberapa kasus, memilih pendekatan yang salah dapat mencegah aplikasi Anda dicantumkan 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 bertentangan. Oleh karena itu, penting untuk mendefinisikan istilah kita.

Jika aplikasi berjalan di latar belakang, sistem akan menerapkan sejumlah batasan 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" untuk mengartikan operasi yang dilakukan aplikasi di luar alur kerja utamanya. Untuk memastikan keselarasan dalam pemahaman, kami telah mengelompokkannya 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 menentukan API yang tepat untuk digunakan dalam tugas Anda dengan menentukan kategori (tugas asinkron, API penjadwalan tugas, atau layanan latar depan) yang sesuai dengan tugas tersebut.

Jika masih ragu, Anda dapat menggunakan diagram alur yang kami sediakan yang menambahkan 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 keputusan masing-masing.

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 melakukan penghitungan 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 yang 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

Task scheduling API adalah opsi yang lebih fleksibel saat Anda perlu melakukan tugas yang harus dilanjutkan meskipun pengguna keluar dari aplikasi. Pada umumnya, opsi terbaik untuk menjalankan tugas latar belakang adalah menggunakan WorkManager, meskipun dalam beberapa kasus, penggunaan API JobScheduler platform mungkin lebih sesuai.

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 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 yang tidak boleh diganggu. Namun, layanan latar depan berpotensi memberikan beban berat pada perangkat, dan terkadang memiliki implikasi privasi dan keamanan. Karena alasan ini, sistem menerapkan banyak batasan terkait cara dan waktu aplikasi dapat menggunakan layanan latar depan. Misalnya, layanan latar depan harus terlihat oleh pengguna, dan dalam sebagian besar kasus, 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, perlu 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 dalam 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 Anda berperforma lebih baik. Dokumentasi jenis layanan latar depan mencatat jika 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
  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 perlu 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 sejumlah opsi untuk melakukan pekerjaan asinkron. Hal penting yang perlu dipahami adalah bahwa semua opsi ini akan berhenti beroperasi jika aplikasi berjalan di latar belakang. (Proses ini juga 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 memperbarui asetnya, pengguna mungkin tidak menyadari apakah operasi tersebut langsung terjadi, atau di tengah malam saat perangkat sedang diisi ulang. Dalam kasus seperti ini, Anda harus menggunakan opsi pekerjaan latar belakang.

Apakah tugas ini 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 khusus untuk tujuan ini?

Jika tugas 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 mungkin menggunakan sensor lokasi untuk memungkinkan pengguna mencatat rute joging mereka 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 yang paling masuk akal.

Namun, karena layanan latar depan berpotensi menggunakan banyak resource perangkat, sistem menerapkan banyak batasan terkait kapan dan cara 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 melakukan tindakan saat pengguna tiba di lokasi tertentu, opsi terbaik adalah menggunakan geofence API, 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:

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

Jika Anda yakin bahwa tugas akan selesai dalam beberapa detik, gunakan pekerjaan asinkron untuk melakukan tugas tersebut. Sistem akan memberi aplikasi Anda waktu 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 tersebut. Bahkan, meskipun aplikasi Anda saat ini berada di latar belakang, aplikasi 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.