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şılamazsa sistem ForegroundServiceStartNotAllowedException
oluşturur.
Ayrıca, bir uygulama kullanım sırasında izinleri (ör. vücut sensörü, kamera, mikrofon veya konum izinleri) gerektiren bir ön plan hizmeti başlatmak istiyorsa uygulama arka plandayken hizmeti oluşturamaz. Bu durum, uygulama arka planda başlatma kısıtlamalarından muafiyet kapsamına girse bile geçerlidir. Bunun nedeni, Kullanım sırasında izinleri gerektiren ön plan hizmetlerinin başlatılmasıyla ilgili kısıtlamalar bölümünde açıklanmaktadır.
Arka planda başlatma kısıtlamalarından muafiyetler
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ş yapıyor.
- Uygulamanız, arka planda etkinlik başlatabilir. Ancak uygulama, mevcut bir görevin arka yığınında bir etkinliğe sahipse bu durum geçerli değildir.
Uygulamanız, Firebase Cloud Messaging'i kullanarak yüksek öncelikli bir mesaj alıyor.
Kullanıcı, uygulamanızla ilgili bir kullanıcı arayüzü öğesinde işlem gerçekleştirir. Örneğin, balon, bildirim, widget veya etkinlikle etkileşimde bulunabilir.
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ıyor.
Cihaz yeniden başlatıldıktan ve
ACTION_BOOT_COMPLETED
,ACTION_LOCKED_BOOT_COMPLETED
, veyaACTION_MY_PACKAGE_REPLACED
yayın alıcısında amaç işlemi aldıktan sonra.Uygulamanız, yayın alıcısında
ACTION_TIMEZONE_CHANGED
,ACTION_TIME_CHANGED
veyaACTION_LOCALE_CHANGED
amaçlı işlemi alıyor.Uygulamanız,
NfcService
kaynağındanACTION_TRANSACTION_DETECTED
etkinliğini alıyor.Cihaz sahipleri ve profil sahipleri gibi belirli sistem rollerine veya izinlerine sahip uygulamalar.
Uygulamanızda Companion Device Manager kullanılıyor ve
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
izni veyaREQUEST_COMPANION_RUN_IN_BACKGROUND
izni beyan ediliyor. Mümkün olduğundaREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
kullanın.Kullanıcı, uygulamanız için pil optimizasyonlarını devre dışı bırakır.
Uygulamanızda
SYSTEM_ALERT_WINDOW
izni kullanılıyor. Not: Uygulamanız Android 15 veya sonraki sürümleri hedefliyorsaSYSTEM_ALERT_WINDOW
iznine sahip olmalı ve şu anda görünür bir yer paylaşımı penceresi olmalıdır.
Kullanım sırasında izinleri gerektiren ön plan hizmetlerinin başlatılmasıyla ilgili kısıtlamalar
Android 14 (API düzeyi 34) veya sonraki sürümlerde, kullanım sırasında izinleri 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 uygun tüm 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.
Kullanım sırasında verilen izinler için bu durum potansiyel bir soruna neden olur. Uygulamanızın "kullanımdayken" izni varsa bu izni yalnızca ön planda kullanabilir. Bu nedenle, uygulamanız arka plandayken kamera, konum veya mikrofon türünde bir ön plan hizmeti oluşturmaya çalışırsa sistem, uygulamanızın gerekli izinlere şu anda sahip olmadığını görür ve SecurityException
oluşturur.
Benzer şekilde, uygulamanız arka planda çalışırken BODY_SENSORS
iznini gerektiren bir sağlık hizmeti oluşturursa uygulama şu anda bu izne sahip değildir ve sistem bir istisna oluşturur.
(Bu durum, ACTIVITY_RECOGNITION
gibi farklı izinler gerektiren bir sağlık hizmeti söz konusuysa geçerli değildir.) Arama yapılması
PermissionChecker.checkSelfPermission()
bu sorunu önlemez. Uygulamanızda kullanım sırasında izin veriliyorsa izni varsa checkSelfPermission()
yöntemini çağırır. Bu durumda, 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" deniyor.
Bu nedenle, ön plan hizmetinizin kullanım sırasında izni gerekiyorsa hizmet tanımlanan muafiyetlerden birine girmediği sürece uygulamanızın görünür bir etkinliği varken Context.startForegroundService()
veya Context.bindService()
işlevini çağırmanız gerekir.
Kullanımdaki 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 hizmeti türünü beyan ediyorsa ve ACCESS_BACKGROUND_LOCATION
iznine sahip bir uygulama tarafından başlatılıyorsa bu hizmet, uygulama arka planda çalışırken bile konum bilgilerine her zaman erişebilir.
Bu durumlar aşağıdaki listede 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şimde bulunarak 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 olan bir uygulama 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 kamera 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