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 tersebut bukan merupakan kasus khusus, sistem akan menampilkan
ForegroundServiceStartNotAllowedException
.
Selain itu, jika aplikasi ingin meluncurkan layanan latar depan yang memerlukan izin saat digunakan (misalnya, izin sensor tubuh, kamera, mikrofon, atau lokasi), aplikasi tidak dapat membuat layanan saat aplikasi berada di latar belakang, meskipun aplikasi termasuk dalam salah satu pengecualian dari pembatasan peluncuran latar belakang. Alasannya dijelaskan di bagian Pembatasan 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 bahkan saat aplikasi berjalan di latar belakang:
- Aplikasi Anda bertransisi dari status yang terlihat oleh pengguna, seperti aktivitas.
- Aplikasi Anda dapat memulai aktivitas dari latar belakang, kecuali jika aplikasi memiliki aktivitas di data sebelumnya pada tugas yang ada.
Aplikasi Anda menerima pesan prioritas tinggi menggunakan Firebase Cloud Messaging.
Pengguna menjalankan tindakan di elemen UI yang terkait dengan aplikasi Anda. Misalnya, pengguna mungkin berinteraksi dengan balon, notifikasi, widget, atau aktivitas.
Aplikasi Anda memanggil alarm yang tepat untuk menyelesaikan tindakan yang diminta pengguna.
Aplikasi Anda adalah metode input perangkat saat ini.
Aplikasi Anda menerima peristiwa yang terkait dengan pembatasan wilayah atau transisi pengenalan aktivitas.
Setelah perangkat dimulai ulang dan menerima tindakan intent
ACTION_BOOT_COMPLETED
,ACTION_LOCKED_BOOT_COMPLETED
, atauACTION_MY_PACKAGE_REPLACED
di penerima siaran.Aplikasi Anda menerima tindakan intent
ACTION_TIMEZONE_CHANGED
,ACTION_TIME_CHANGED
, atauACTION_LOCALE_CHANGED
di penerima siaran.Aplikasi Anda menerima peristiwa
ACTION_TRANSACTION_DETECTED
dariNfcService
.Aplikasi dengan peran atau izin sistem tertentu, seperti pemilik perangkat dan pemilik profil.
Aplikasi Anda menggunakan Pengelola Perangkat Pendamping dan mendeklarasikan izin
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
atau izinREQUEST_COMPANION_RUN_IN_BACKGROUND
. Jika memungkinkan, gunakanREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
.Pengguna menonaktifkan pengoptimalan baterai untuk aplikasi Anda.
Aplikasi Anda memiliki izin
SYSTEM_ALERT_WINDOW
. Catatan: Jika menargetkan Android 15 atau yang lebih tinggi, aplikasi Anda harus memiliki izinSYSTEM_ALERT_WINDOW
dan saat ini aplikasi harus memiliki jendela overlay yang terlihat.
Pembatasan untuk memulai layanan latar depan yang memerlukan izin saat penggunaan
Di Android 14 (API level 34) atau yang lebih baru, ada situasi khusus yang harus diketahui 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 dari jenis
microphone, 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 dapat menyebabkan potensi masalah. Jika memiliki
izin saat digunakan, aplikasi hanya memiliki izin tersebut saat berada di
latar depan. Artinya, jika aplikasi Anda berada di latar belakang, dan mencoba membuat
layanan latar depan dari jenis kamera, lokasi, atau mikrofon, sistem akan melihat
bahwa aplikasi Anda saat ini tidak memiliki izin yang diperlukan, dan menampilkan
SecurityException
.
Demikian pula, jika aplikasi Anda berada di latar belakang dan membuat
layanan kesehatan yang memerlukan izin BODY_SENSORS
, aplikasi
saat ini tidak memiliki izin tersebut, dan sistem akan menampilkan pengecualian.
(Hal ini tidak berlaku jika layanan 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
akan menampilkan PERMISSION_GRANTED
meskipun aplikasi berada di latar belakang. Saat
metode menampilkan PERMISSION_GRANTED
, metode tersebut akan menampilkan "aplikasi Anda memiliki izin ini
saat aplikasi sedang digunakan".
Oleh karena itu, jika layanan latar depan memerlukan izin saat digunakan, Anda
harus memanggil Context.startForegroundService()
atau Context.bindService()
saat
aplikasi memiliki aktivitas yang terlihat, kecuali jika layanan termasuk dalam salah satu
pengecualian yang ditentukan.
Pengecualian dari batasan pada izin saat penggunaan
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 ini, jika layanan mendeklarasikan jenis layanan
latar depan location
dan dimulai oleh aplikasi yang
memiliki izin ACCESS_BACKGROUND_LOCATION
, layanan ini dapat mengakses informasi lokasi sepanjang waktu, 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 hak 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