Ön plan hizmetleriyle ilgili sorunları giderme

Bu sayfada, ön plan hizmetlerinin başarısız olmasının bazı yaygın nedenleri ele alınmakta ve soruna neyin neden olduğunu belirlemenize yardımcı olunmaktadır.

Bu dokümanda aşağıdaki konular ele alınmaktadır:

Sorun gidermeden önce

Ön plan hizmetlerinde yapılan son değişiklikleri kontrol etme

Ön plan hizmetleri yanlış kullanılırsa cihaz performansı ve pil ömrü üzerinde olumsuz etkileri olabilir. Bu nedenle, Android platform sürümlerinde bu olumsuz etkileri sınırlamak için genellikle ön plan hizmet davranışında değişiklikler yapılır.

Ön plan hizmetleriyle ilgili sorun yaşıyorsanız ön plan hizmetlerinde yapılan değişiklikler dokümanlarını inceleyerek sorunlarınızın nedenini açıklayabilecek yakın zamanda yapılan bir değişiklik olup olmadığını kontrol etmeniz gerekir. Özellikle aşağıdaki durumlarda değişiklikler olup olmadığını kontrol etmek önemlidir:

  • Daha önce çalışan ön plan hizmeti kodu artık çalışmıyor
  • Yeni bir platform sürümünde test yapmaya yeni başladıysanız veya uygulamanızın hedeflediği API düzeyini değiştirdiyseniz

Ayrıca, cihazınızı platformun geliştirici önizlemesinde test ediyorsanız geliştirici önizleme belgelerinin en son sürümünü kontrol ettiğinizden emin olun.

Uygulama Yanıt Vermiyor (ANR) hataları

Belirli durumlarda, uygulamanın ön plan hizmetini kapatması beklenir. Uygulama hizmeti durdurmazsa sistem hizmeti durdurur ve Uygulama Yanıt Vermiyor (ANR) hatası tetikler.

Kısa hizmet çok uzun süre çalıştığı için ANR oluşuyor

shortService türünü kullanan ön plan hizmetleri yaklaşık üç dakika içinde hızlıca tamamlanmalıdır. Süre dolduktan sonra sistem, hizmetin Service.onTimeout(int,int) yöntemini çağırır. Hizmetin stopSelf() numarasını araması için birkaç saniye süre tanınır. Hizmet kendi kendine durmazsa sistem bir Uygulama Yanıt Vermiyor hatası tetikler.

Teşhis etme:

ANR, ön plan hizmetinin kendisini durduramaması nedeniyle oluştuysa sistem dahili bir istisna atar. Logcat'i kontrol ederek sorunun bu olduğunu doğrulayabilirsiniz. Bu durumda günlükte aşağıdaki mesaj yer alır:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type FOREGROUND_SERVICE_TYPE_SHORT_SERVICE did not stop within its timeout:
[component name]"

Düzeltme:

Zaman sınırı olan tüm ön plan hizmetlerinin çalışmalarını tamamladığından ve sistem zaman sınırı içinde stopForeground(int) çağrısı yaptığından emin olun.

Ön plan hizmetlerinizin Service.onTimeout(int,int) özelliğini uyguladığından emin olun. Bu yöntemi uygularken stopSelf() işlevini hemen çağırdığınızdan emin olun.

Ön plan hizmeti istisnaları

Bu bölümde, sistemin istisna atmasına neden olabilecek çeşitli ön plan hizmeti sorunları açıklanmaktadır. Uygulama istisnayı yakalamazsa kullanıcıya uygulamanın durdurulduğunu belirten bir iletişim kutusu gösterilir.

Bazı durumlarda sistem dahili bir istisna oluşturur. Bu istisnaları yakalayamazsınız ancak hangi istisnanın atıldığını görmek için Logcat'e bakabilirsiniz.

Dahili istisna: Zaman aşımı aşıldı

Sistem, uygulama arka plandayken veri senkronizasyonu ve medya işleme ön plan hizmetlerinin ne kadar süre boyunca çalışabileceğine dair bir sınırlama uygular. Hizmet bu sınırı aşarsa sistem, hizmetin Service.onTimeout(int,int) yöntemini çağırır. Hizmetin stopSelf()'ü araması için birkaç saniye süre tanınır. Hizmet kendini durdurmazsa sistem, uygulamanın kilitlenmesine neden olan dahili bir istisna oluşturur.

Teşhis etme:

Zaman aşımı aşıldıysa Logcat aşağıdaki mesajı içerir:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

Düzeltme:

Zaman sınırı olan tüm ön plan hizmetlerinin çalışmalarını tamamladığından ve sistem zaman sınırı içinde stopForeground(int) çağrısında bulunduğundan emin olun.

Ön plan hizmetlerinizin Service.onTimeout(int,int) özelliğini uyguladığından emin olun. Bu yöntemi uygularken stopSelf() işlevini hemen çağırdığınızdan emin olun.

Dahili istisna: ForegroundServiceDidNotStartInTimeException

context.startForegroundService() çağrısı yaparak bir hizmeti başlattığınızda, söz konusu hizmetin ServiceCompat.startForeground() çağrısı yaparak kendisini ön plan hizmetine yükseltmesi için birkaç saniye süre tanınır. Hizmet bunu yapmazsa sistem bir ANR hatası tetikler.

Teşhis etme:

Bir ön plan hizmeti zamanında başlatılmazsa uygulama kilitlenir ve kullanıcıya Uygulama durdu iletişim kutusu gösterilir. Bu durumda Logcat'te aşağıdaki mesajı görebilirsiniz:

android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()

Düzeltme:

Yeni oluşturulan tüm ön plan hizmetlerinin birkaç saniye içinde ServiceCompat.startForeground() çağrısı yaptığından emin olun.

ForegroundServiceStartNotAllowedException

Hata:

Sistem ForegroundServiceStartNotAllowedException hatası veriyor.

Neden:

Bu durum genellikle geçerli bir muafiyet olmadığında uygulamanın arka plandan ön plan hizmeti başlatmasından kaynaklanır.

Android 12 (API düzeyi 31) sürümünden itibaren, belirli istisnalar dışında uygulamaların arka planda çalışırken ön plan hizmetlerini başlatmasına izin verilmez. Arka plandan bir ön plan hizmeti başlatmayı denerseniz ve muafiyetlerden birinin koşullarını karşılamıyorsanız sistem ForegroundServiceStartNotAllowedException hatası verir. Sistem, muafiyet koşullarını karşılamıyorsanız da bunu yapar.

Örneğin, bir uygulamada kullanıcının tıklayabileceği bir düğme olabilir. Bu düğme, uygulamanın bazı işlemleri yapmasına ve ardından bir ön plan hizmeti başlatmasına neden olur. Bu durumda, kullanıcının düğmeyi tıkladıktan sonra uygulamayı hemen arka plana koyma tehlikesi vardır. Bu durumda uygulama, hizmeti arka plandan başlatmaya çalışır. Uygulama, belirtilen muafiyetler arasından birini karşılamıyorsa sistem bir ForegroundServiceStartNotAllowedException oluşturur.

Ayrıca bazı muafiyetler için kısa bir süre sınırı vardır. Örneğin, uygulamanız yüksek öncelikli bir FCM mesajına yanıt olarak ön plan hizmeti başlatırsa kısa bir muafiyet uygulanır. Hizmeti yeterince hızlı başlatmazsanız ForegroundServiceStartNotAllowedException alırsınız.

Belirli muafiyetler, yeni Android sürümleriyle birlikte bazen daha kısıtlayıcı hale gelebilir. Uygulamanızın hedeflediği Android sürümünü değiştirdiyseniz ön plan hizmetlerinde yapılan değişiklikler dokümanlarını kontrol edin ve uygulamanızın izin verilen muafiyetler arasından birini karşıladığını doğrulayın.

Düzeltme:

Uygulamanızın iş akışını, uygulama arka plandayken ön plan hizmetlerini başlatması gerekmeyecek şekilde değiştirin veya uygulamanızın muafiyetlerden birini karşıladığını onaylayın.

Uygulamanızın yaşam döngüsünü yönetmek için LiveData gibi yaşam döngüsü bileşenlerini kullanabilirsiniz. Böylece, yanlışlıkla arka plandan ön plan hizmeti başlatmaya çalışmazsınız.

SecurityException

Hata:

SistemSecurityException hatası verir.

Neden:

Uygulamanız, gerekli izinlere sahip olmadan ön plan hizmeti başlatmaya çalıştı.

  • Android 9 (API düzeyi 28) veya sonraki sürümleri hedefleyen uygulamaların, ön plan hizmeti başlatmaFOREGROUND_SERVICE iznine sahip olması gerekir.
  • Android 14 (API düzeyi 34) veya sonraki sürümleri hedefleyen uygulamalar, ön plan hizmet türü için tüm ön koşulları karşılamalıdır. Bu ön koşullar, ön plan hizmet türleri dokümanlarında ayrıntılı olarak açıklanmıştır. Özellikle aşağıdaki şartlara dikkat edin:
    • Bazı ön plan hizmet türleri belirli çalışma zamanı izinleri gerektirir. Örneğin, uzak mesajlaşma ön plan hizmetinin FOREGROUND_SERVICE_REMOTE_MESSAGING iznine sahip olması gerekir.
  • Bazı durumlarda, bazı ön plan hizmet türlerinin ihtiyaç duyduğu izinler için kullanım sırasında ek kısıtlamalar vardır. Bu izinler yalnızca uygulama ön plandayken verilir (belirli birkaç istisna dışında). Bu, uygulamanız bu izinlerden birini istemiş ve almış olsa bile, arka plandayken ön plan hizmetini başlatmaya çalışırsa sistem, arka plandan ön plan hizmeti başlatma muafiyeti olsa bile SecurityException hatası verir. Daha fazla bilgi için Kullanımdayken izin gerektiren ön plan hizmetlerini başlatmayla ilgili kısıtlamalar başlıklı makaleyi inceleyin.
    • Gerekli izinleri istediyseniz ancak gerekli izinlerin verildiğini onaylamadan önce ön plan hizmetini başlatırsanız SecurityException alabilirsiniz.

Düzeltme:

Ön plan hizmetini başlatmadan önce tüm uygun ön plan hizmet izinlerini isteyin ve diğer tüm çalışma zamanı ön koşullarını karşıladığınızı onaylayın.