Batasan dalam memulai layanan latar depan dari latar belakang

Aplikasi yang menargetkan Android 12 (API level 31) atau yang lebih tinggi tidak dapat memulai layanan latar depan saat aplikasi berjalan di latar belakang, kecuali untuk beberapa kasus khusus. Jika aplikasi mencoba memulai layanan latar depan saat aplikasi berjalan di latar belakang, dan layanan latar depan tidak memenuhi salah satu kasus pengecualian, sistem akan menampilkan ForegroundServiceStartNotAllowedException.

Selain itu, jika aplikasi ingin meluncurkan layanan latar depan yang memerlukan izin saat digunakan (misalnya, sensor tubuh, kamera, mikrofon, atau izin lokasi), aplikasi tidak dapat membuat layanan saat aplikasi berada di latar belakang, meskipun aplikasi termasuk dalam salah satu pengecualian dari batasan mulai latar belakang. Alasannya dijelaskan di bagian Batasan dalam memulai layanan latar depan yang memerlukan izin saat digunakan.

Pengecualian dari batasan memulai di latar belakang

Dalam situasi berikut, aplikasi Anda dapat memulai layanan latar depan meskipun aplikasi berjalan di latar belakang:

Batasan untuk memulai layanan latar depan yang memerlukan izin saat digunakan

Di Android 14 (level API 34) atau yang lebih tinggi, ada situasi khusus yang perlu diperhatikan jika Anda memulai layanan latar depan yang memerlukan izin saat digunakan.

Jika aplikasi Anda menargetkan Android 14 atau yang lebih tinggi, sistem operasi akan memeriksa saat Anda membuat layanan latar depan untuk memastikan aplikasi Anda memiliki semua izin yang sesuai untuk jenis layanan tersebut. Misalnya, saat Anda membuat layanan latar depan jenis mikrofon, sistem operasi akan memverifikasi bahwa aplikasi Anda saat ini memiliki izin RECORD_AUDIO. Jika Anda tidak memiliki izin tersebut, sistem akan menampilkan SecurityException.

Untuk izin saat digunakan, hal ini menyebabkan potensi masalah. Jika aplikasi Anda memiliki izin saat digunakan, aplikasi tersebut hanya memiliki izin tersebut saat berada di latar depan. Artinya, jika aplikasi Anda berada di latar belakang, dan mencoba membuat layanan latar depan jenis kamera, lokasi, atau mikrofon, sistem akan melihat bahwa aplikasi Anda saat ini tidak memiliki izin yang diperlukan, dan akan menampilkan SecurityException.

Demikian pula, jika aplikasi Anda berada di latar belakang dan membuat fitur kesehatan yang memerlukan izin BODY_SENSORS, aplikasi saat ini tidak memiliki izin tersebut, dan sistem akan menampilkan pengecualian. (Hal ini tidak berlaku jika Fitur Kesehatan memerlukan izin yang berbeda, seperti ACTIVITY_RECOGNITION.) Memanggil PermissionChecker.checkSelfPermission() tidak mencegah masalah ini. Jika aplikasi Anda memiliki izin saat digunakan, dan memanggil checkSelfPermission() untuk memeriksa apakah aplikasi memiliki izin tersebut, metode ini akan menampilkan PERMISSION_GRANTED meskipun aplikasi berada di latar belakang. Jika metode menampilkan PERMISSION_GRANTED, artinya "aplikasi Anda memiliki izin ini saat aplikasi sedang digunakan".

Oleh karena itu, jika layanan latar depan Anda memerlukan izin saat digunakan, Anda harus memanggil Context.startForegroundService() atau Context.bindService() saat aplikasi Anda memiliki aktivitas yang terlihat, kecuali jika layanan tersebut termasuk dalam salah satu pengecualian yang ditentukan.

Pengecualian dari pembatasan izin saat digunakan

Dalam beberapa situasi, meskipun layanan latar depan dimulai saat aplikasi berjalan di latar belakang, layanan tersebut masih dapat mengakses informasi lokasi, kamera, dan mikrofon saat aplikasi berjalan di latar depan ("saat digunakan").

Dalam situasi yang sama, jika layanan mendeklarasikan jenis layanan latar depan location dan dimulai oleh aplikasi yang memiliki izin ACCESS_BACKGROUND_LOCATION, layanan ini dapat mengakses informasi lokasi setiap saat, bahkan saat aplikasi berjalan di latar belakang.

Daftar berikut berisi situasi tersebut:

  • Komponen sistem memulai layanan.
  • Layanan dimulai dengan berinteraksi dengan widget aplikasi.
  • Layanan dimulai dengan berinteraksi dengan notifikasi.
  • Layanan dimulai sebagai PendingIntent yang dikirim dari aplikasi lain yang terlihat.
  • Layanan dimulai oleh aplikasi yang merupakan pengontrol kebijakan perangkat yang berjalan dalam mode pemilik perangkat.
  • Layanan dimulai oleh aplikasi yang menyediakan VoiceInteractionService.
  • Layanan dimulai oleh aplikasi yang memiliki izin istimewa START_ACTIVITIES_FROM_BACKGROUND.

Menentukan layanan yang terpengaruh di aplikasi Anda

Saat menguji aplikasi Anda, mulai layanan latar depannya. Jika layanan yang dimulai memiliki akses terbatas ke lokasi, mikrofon, dan kamera, pesan berikut akan muncul di Logcat:

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME