Android 12 (API düzeyi 31) veya sonraki sürümleri hedefleyen uygulamalar, birkaç özel durum dışında, 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 istisnai durumlardan birini karşılamıyorsa sistem ForegroundServiceStartNotAllowedException hatası verir.
Ayrıca, kullanımdayken izinleri (ör. vücut sensörü, kamera, mikrofon veya konum izinleri) gerektiren bir ön plan hizmeti başlatmak isteyen uygulamalar, arka planda başlatma kısıtlamalarından muaf tutulan durumlardan birine girse bile uygulama arka plandayken hizmeti oluşturamaz. Bunun nedeni, Kullanım sırasında izinleri gerektiren ö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 muafiyetler
Aşağıdaki durumlarda uygulamanız arka planda çalışırken bile ön plan hizmetlerini başlatabilir:
- Uygulamanız, etkinlik gibi kullanıcı tarafından görülebilen bir durumdan geçiş yapar.
- Uygulamanız, mevcut bir görevin eski yığınında bir etkinliği olduğu durumlar dışında 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 yapar. Örneğin, bir baloncuk, bildirim, widget veya etkinlikle etkileşim kurabilir.
Uygulamanız, kullanıcının istediği bir işlemi tamamlamak için kesin zamanlı alarm çağırıyor.
Uygulamanız, cihazın mevcut giriş yöntemidir.
Uygulamanız, coğrafi sınır çizme veya hareket tanıma geçişi ile ilgili bir etkinlik alır.
Cihaz yeniden başlatıldıktan ve bir yayın alıcısında
ACTION_BOOT_COMPLETED,ACTION_LOCKED_BOOT_COMPLETEDveyaACTION_MY_PACKAGE_REPLACEDintent işlemini aldıktan sonra.Uygulamanız bir yayın alıcısında
ACTION_TIMEZONE_CHANGED,ACTION_TIME_CHANGEDveyaACTION_LOCALE_CHANGEDintent işlemini alıyor.Uygulamanız,
NfcServiceadlı sağlayıcıdanACTION_TRANSACTION_DETECTEDetkinliğ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_BACKGROUNDiznini veyaREQUEST_COMPANION_RUN_IN_BACKGROUNDiznini beyan ediyor. Mümkün olduğundaREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDkullanın.Kullanıcı, uygulamanız için pil optimizasyonlarını devre dışı bırakırsa.
Uygulamanızda
SYSTEM_ALERT_WINDOWizni olmalıdır. Not: Uygulamanız Android 15 veya sonraki sürümleri hedefliyorsaSYSTEM_ALERT_WINDOWiznine sahip olması ve uygulamanın şu anda görünür bir yer paylaşımı penceresine sahip olması gerekir.
"Kullanım sırasında" izinleri gerektiren ö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 izin gerektiren 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 söz konusu hizmet türü için tüm uygun izinlere sahip olup olmadığını kontrol eder. Örneğin, mikrofon türünde bir ön plan hizmeti oluşturduğunuzda işletim sistemi, uygulamanızın şu anda RECORD_AUDIO iznine sahip olduğunu doğrular. Bu izne sahip değilseniz sistem SecurityException hatası verir.
Bu durum, "uygulamayı kullanırken" izinleri için olası bir soruna neden olur. Uygulamanızın kullanımdayken izni varsa bu izne yalnızca ön plandayken sahip olur. Yani uygulamanız arka plandaysa ve kamera, konum veya mikrofon türünde bir ön plan hizmeti oluşturmaya çalışırsa sistem, uygulamanızın şu anda gerekli izinlere sahip olmadığını görür ve SecurityException hatası verir.
Benzer şekilde, uygulamanız arka plandaysa ve BODY_SENSORS izni gerektiren bir sağlık hizmeti oluşturuyorsa uygulamanın şu anda bu izni yoktur ve sistem bir istisna oluşturur.
(Bu durum, ACTIVITY_RECOGNITION gibi farklı izinler gerektiren bir sağlık hizmeti için geçerli değildir.) PermissionChecker.checkSelfPermission() yöntemini çağırmak bu sorunu önlemez. Uygulamanızda kullanım sırasında izin varsa ve bu izne sahip 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 değerini döndürdüğünde "Uygulamanız, uygulama kullanımdayken bu izne sahip" anlamına gelir.
Bu nedenle, ön plan hizmetiniz kullanımdayken izin gerektiriyorsa hizmet tanımlanmış muafiyetlerden birine girmediği sürece uygulamanızda görünür bir etkinlik varken Context.startForegroundService() veya Context.bindService() yöntemini çağırmanız gerekir.
Kullanım sırasında izinlerle ilgili kısıtlamalardan muafiyetler
Bazı durumlarda, uygulama arka planda çalışırken ön plan hizmeti başlatılsa bile uygulama ön planda çalışırken ("kullanımdayken") konum, kamera ve mikrofon bilgilerine erişebilir.
Aynı durumlarda, hizmet location ön plan hizmet türünü 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şim kurarak başlar.
- Hizmet, bir bildirimle etkileşim kurarak başlar.
- Hizmet, farklı ve görünür bir uygulamadan gönderilen
PendingIntentolarak başlar. - Hizmet, cihaz sahibi modunda çalışan bir cihaz politikası denetleyici uygulaması tarafından başlatılır.
- Hizmet,
VoiceInteractionServicesağlayan bir uygulama tarafından başlatılır. - Hizmet,
START_ACTIVITIES_FROM_BACKGROUNDayrı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 konuma, mikrofona ve kameraya erişimi kısıtlanmışsa Logcat'te aşağıdaki mesaj görünür:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME