Android 12 (API düzeyi 31) veya sonraki sürümleri hedefleyen uygulamalar, birkaç özel durum hariç olmak üzere uygulama arka planda çalışırken ön plan hizmetlerini başlatamaz. Bir uygulama arka planda çalışırken ön plan hizmeti başlatmaya çalışırsa ve ön plan hizmeti istisna durumlarından birini karşılamıyorsa sistem bir ForegroundServiceStartNotAllowedException
oluşturur.
Ayrıca, kullanım sırasında izinlere (ör. vücut sensörü, kamera, mikrofon veya konum izinleri) ihtiyaç duyan bir ön plan hizmeti başlatmak isteyen uygulamalar, arka planda başlatma kısıtlamalarından istisna olan uygulamalardan biri olsa bile arka plandayken hizmeti oluşturamaz. Bunun nedeni, Kullanımdayken izinlere ihtiyaç duyan ön plan hizmetlerini başlatmayla ilgili kısıtlamalar bölümünde açıklanmıştır.
Arka planda başlatma kısıtlamalarından muafiyet
Uygulamanız arka planda çalışırken bile aşağıdaki durumlarda ön plan hizmetlerini başlatabilir:
- Uygulamanız, kullanıcı tarafından görülebilen bir durumdan (ör. etkinlik) geçiş yapar.
- Uygulamanız, mevcut bir görevin arka yığında etkinliği olduğu durumlar hariç arka planda etkinlik başlatabilir.
Uygulamanız Firebase Cloud Messaging'i kullanarak yüksek öncelikli bir mesaj alır.
Kullanıcı, uygulamanızla ilgili bir kullanıcı arayüzü öğesinde işlem gerçekleştirir. Örneğin, bir balon, bildirim, widget veya etkinlikle etkileşim kurabilir.
Uygulamanız, kullanıcının istediği bir işlemi tamamlamak için tam alarm çağırıyor.
Uygulamanız, cihazın mevcut giriş yöntemidir.
Uygulamanız, coğrafi sınırlama veya etkinlik tanıma geçişi ile ilgili bir etkinlik alır.
Cihaz yeniden başlatıldıktan ve yayın alıcısında
ACTION_BOOT_COMPLETED
,ACTION_LOCKED_BOOT_COMPLETED
veyaACTION_MY_PACKAGE_REPLACED
intent işlemini aldıktan sonra.Uygulamanız, yayın alıcısında
ACTION_TIMEZONE_CHANGED
,ACTION_TIME_CHANGED
veyaACTION_LOCALE_CHANGED
intent işlemini alıyor.Uygulamanız,
NfcService
kaynağındanACTION_TRANSACTION_DETECTED
etkinliğini alır.Cihaz sahipleri ve profil sahipleri gibi belirli sistem rollerine veya izinlerine sahip uygulamalar.
Uygulamanız Companion Device Manager'ı kullanıyor ve
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
iznini ya daREQUEST_COMPANION_RUN_IN_BACKGROUND
iznini beyan ediyor. Mümkün olduğundaREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
kullanın.Kullanıcı, uygulamanız için pil optimizasyonlarını kapatır.
Uygulamanız
SYSTEM_ALERT_WINDOW
iznine sahip. Not: Uygulamanız Android 15 veya sonraki sürümleri hedefliyorsaSYSTEM_ALERT_WINDOW
iznine sahip olmalıdır ve uygulamada şu anda görünür bir yer paylaşımı penceresi olmalıdır.
Kullanımdayken izinlere ihtiyaç duyan ön plan hizmetlerini başlatmayla ilgili kısıtlamalar
Android 14 (API düzeyi 34) veya sonraki sürümlerde, kullanım sırasında izinlere ihtiyaç duyan bir ön plan hizmeti başlatıyorsanız dikkat etmeniz gereken özel durumlar vardır.
Uygulamanız Android 14 veya sonraki sürümleri hedefliyorsa işletim sistemi, ön plan hizmeti oluşturduğunuzda uygulamanızın ilgili hizmet türü için tüm uygun izinlere sahip olduğundan emin olmak üzere kontrol yapar. Örneğin, mikrofon türüne sahip bir ön plan hizmeti oluşturduğunuzda işletim sistemi, uygulamanızın şu anda RECORD_AUDIO
iznine sahip olup olmadığını doğrular. Bu izniniz yoksa sistem bir SecurityException
hatası verir.
Bu durum, kullanım sırasında izinler için potansiyel bir soruna neden olur. Uygulamanız kullanımdayken iznine sahipse bu izne yalnızca ön plandayken sahip olur. Yani uygulamanız arka plandayken kamera, konum veya mikrofon türündeki bir ön plan hizmeti oluşturmaya çalışırsa sistem, uygulamanızın şu anda gerekli izinlere sahip olmadığını görür ve bir SecurityException
oluşturur.
Benzer şekilde, uygulamanız arka plandaysa ve BODY_SENSORS
iznine ihtiyaç duyan bir sağlık hizmeti oluşturuyorsa uygulama şu anda bu izne sahip değildir ve sistem bir istisna oluşturur.
(Bu, ACTIVITY_RECOGNITION
gibi farklı izinlere ihtiyaç duyan bir sağlık hizmeti söz konusu olduğunda geçerli değildir.) PermissionChecker.checkSelfPermission()
çağrısı bu sorunu önlemez. Uygulamanız kullanım sırasında izine sahipse ve bu iznin olup olmadığını kontrol etmek için checkSelfPermission()
yöntemini çağırıyorsa uygulama arka planda olsa bile yöntem PERMISSION_GRANTED
değerini döndürür. Yöntem PERMISSION_GRANTED
döndürdüğünde "Uygulama kullanılırken uygulamanız bu izne sahip" anlamına gelir.
Bu nedenle, ön plan hizmetinizin kullanımdayken iznine ihtiyacı varsa hizmet tanımlanmış muafiyetler arasında yer almadığı sürece uygulamanızda görünür bir etkinlik varken Context.startForegroundService()
veya Context.bindService()
çağrısını yapmanız gerekir.
Kullanımdayken izinleriyle ilgili kısıtlamalardan muafiyet
Bazı durumlarda, uygulama arka planda çalışırken başlatılmış olsa bile ön planda çalışırken ("kullanımdayken") konum, kamera ve mikrofon bilgilerine erişebilir.
Aynı durumlarda, hizmet location
ön plan hizmet türü beyan ederse ve ACCESS_BACKGROUND_LOCATION
iznine sahip bir uygulama tarafından başlatılırsa bu hizmet, uygulama arka planda çalışırken bile konum bilgilerine her zaman erişebilir.
Aşağıdaki listede bu durumlar yer almaktadır:
- Bir sistem bileşeni hizmeti başlatır.
- Hizmet, uygulama widget'larıyla etkileşime geçerek başlar.
- Hizmet, bir bildirimle etkileşime geçerek başlar.
- Hizmet, farklı ve görünür bir uygulamadan gönderilen bir
PendingIntent
olarak başlar. - Hizmet, cihaz sahibi modunda çalışan bir cihaz politikası denetleyici uygulaması tarafından başlatılır.
- Hizmet,
VoiceInteractionService
sağlayan bir uygulama tarafından başlatılır. - Hizmet,
START_ACTIVITIES_FROM_BACKGROUND
ayrıcalıklı iznine sahip bir uygulama tarafından başlatılır.
Uygulamanızda hangi hizmetlerin etkilendiğini belirleme
Uygulamanızı test ederken ön plan hizmetlerini başlatın. Başlatılan bir hizmetin konum, mikrofon ve kameraya erişimi kısıtlanmışsa Logcat'te aşağıdaki mesaj gösterilir:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME