Arka plandan ön plan hizmeti başlatmayla ilgili kısıtlamalar

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:

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