Ringkasan pekerjaan latar belakang

Sering kali, aplikasi perlu melakukan lebih dari satu hal sekaligus. API Android menyediakan berbagai cara untuk memungkinkan Anda melakukan hal ini. Memilih opsi yang tepat sangat penting; sebuah opsi mungkin tepat untuk satu situasi, tetapi salah untuk situasi lainnya. Memilih API yang salah dapat menurunkan performa aplikasi atau efisiensi resource, 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 pekerjaan 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 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 jenis tugas utama: pekerjaan asinkron, pekerjaan latar belakang, dan layanan latar depan.

Pilih opsi yang tepat

Dalam sebagian besar skenario, Anda dapat mengetahui API yang tepat untuk digunakan untuk tugas Anda dengan menentukan kategori (pekerjaan asinkron, pekerjaan latar belakang, atau layanan latar depan) tugasnya.

Jika masih ragu, Anda dapat menggunakan diagram alir yang kami sediakan untuk menambah nuansa pada keputusan. Setiap opsi ini akan dijelaskan secara lebih mendetail nanti dalam dokumen ini.

Ada dua skenario utama yang perlu dipertimbangkan untuk pekerjaan 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 melakukan penghitungan di UI thread, pengguna tidak akan dapat berinteraksi dengan aplikasi hingga penghitungan selesai; hal ini dapat mengakibatkan 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. Perlu diperhatikan bahwa tidak seperti pekerjaan 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).

Pekerjaan latar belakang

Pekerjaan latar belakang adalah opsi yang lebih fleksibel saat Anda perlu melakukan pekerjaan yang harus terus berlanjut meskipun pengguna keluar dari aplikasi. Pada umumnya, opsi terbaik untuk pekerjaan latar belakang adalah menggunakan WorkManager, meskipun dalam beberapa kasus mungkin tepat untuk menggunakan JobScheduler API 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 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 pekerjaan latar belakang adalah:

  • Mengambil data dari server secara berkala
  • Mengambil data sensor (misalnya, data penghitung langkah)
  • Mendapatkan data lokasi secara 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 menjalankan tugas dengan segera dan tidak boleh diganggu. Namun, layanan latar depan berpotensi memberikan beban berat pada perangkat, dan terkadang memiliki implikasi privasi dan keamanan. Karena alasan ini, sistem memberlakukan banyak pembatasan pada cara dan waktu aplikasi dapat menggunakan layanan latar depan. Misalnya, layanan latar depan harus terlihat oleh pengguna, dan umumnya 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 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 jangka panjang. 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 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 performa aplikasi menjadi 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 pekerjaan 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 berfungsi 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 me-refresh 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 tidak akan terganggu jika tugas ditunda atau dibatalkan. Misalnya, jika aplikasi perlu memperbarui asetnya, pengguna mungkin tidak menyadari apakah operasi langsung terjadi, atau pada tengah malam saat perangkat sedang mengisi 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 hanya untuk tujuan ini?

Jika tugas tidak terlihat oleh pengguna, solusi yang tepat mungkin menggunakan layanan latar depan. Layanan ini berjalan terus-menerus setelah dimulai, sehingga merupakan pilihan yang baik ketika menyela 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 akan menjadi hal yang paling masuk akal.

Namun, karena layanan latar depan berpotensi menggunakan banyak resource perangkat, sistem menerapkan banyak pembatasan terkait waktu dan cara layanan tersebut dapat digunakan. 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 untuk merespons peristiwa

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

Terkadang aplikasi perlu melakukan pekerjaan latar belakang untuk merespons pemicu, seperti:

Hal ini dapat menjadi 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 yakin bahwa 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, sebaiknya mulai layanan latar depan untuk menangani tugas. 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 pembatasan memulai latar belakang yang disetujui. Misalnya, jika aplikasi menerima pesan FCM prioritas tinggi, aplikasi tersebut diizinkan untuk memulai layanan latar depan meskipun aplikasi berada di latar belakang.

Jika tugas akan memerlukan waktu lebih dari beberapa detik, gunakan pekerjaan latar belakang.