Ön plan hizmetleriyle ilgili sorunları giderme

Bu sayfada, ön plan hizmetlerinin başarısız olmasının yaygın nedenlerinden bazıları ele alınmakta ve sorunun kaynağını belirlemenize yardımcı olunmaktadır.

Bu belgede aşağıdaki sorunlar ele alınmaktadır:

Sorun giderme işlemine başlamadan önce

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

Ön plan hizmetleri düzgün kullanılmazsa cihaz performansını ve pil ömrünü olumsuz etkileyebilir. Bu nedenle, Android platformu sürümleri, bu kötü etkileri sınırlamak için genellikle ön plan hizmeti davranışında değişiklikler yapar.

Ön plan hizmetleriyle ilgili sorun yaşıyorsanız ön plan hizmetlerindeki değişiklikler ile ilgili dokümanları inceleyerek sorunlarınızın nedenini açıklayabilecek son değişiklikler olup olmadığına bakın. Aşağıdaki durumlarda değişiklik olup olmadığını kontrol etmek özellikle önemlidir:

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

Ayrıca, cihazınızı platformun geliştirici önizlemesinde test ediyorsanız geliştirici önizlemesi belgelerinin en son sürümünü kontrol edin.

Uygulama Yanıt Vermiyor (ANR) hataları

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

Kısa hizmet çok uzun süre çalışarak ANR'ye neden oluyor

Kısa hizmet türünü kullanan ön plan hizmetleri yaklaşık üç dakika içinde hızlıca tamamlanmalıdır. Süre dolduğunda sistem, hizmetin Service.onTimeout(int,int) yöntemini çağırır. Hizmetin stopSelf() yöntemini çağırmak için birkaç saniyesi vardır. Hizmet kendi kendine durmazsa sistem, Uygulama Yanıt Vermiyor hatasını tetikler.

Teşhis:

ANR, bir ön plan hizmetinin kendisini durduramamasından kaynaklanıyorsa sistem dahili bir istisna oluşturur. ANR raporlarını kontrol ederek sorunun bu olup olmadığını doğrulayabilirsiniz. Sorun buysa raporda 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:

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

Ön plan hizmetlerinizin Service.onTimeout(int,int) uygulamasını sağlayın. Bu yöntemi uygularken stopSelf() yöntemini hemen çağırdığınızdan emin olun.

Ön plan hizmeti istisnaları

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

Bazı durumlarda sistem dahili bir istisna oluşturur. Bu gibi durumlarda, yığın izlemeye bakarak istisnanın ne olduğunu öğrenebilir ve daha ayrıntılı hata bilgileri için Logcat'i kontrol edebilirsiniz.

Dahili istisna: Zaman aşımı süresi aşıldı

Sistem, uygulama arka plandayken veri senkronizasyonu ve medya işleme ön plan hizmetlerinin ne kadar süre çalışabileceğine dair bir sınır koyar. Hizmet bu sınırı aşarsa sistem, hizmetin Service.onTimeout(int,int) yöntemini çağırır. Hizmetin stopSelf() yöntemini çağırmak için birkaç saniyesi vardır. Hizmet kendiliğinden durmazsa sistem dahili bir RemoteServiceException oluşturarak uygulamanın kilitlenmesine neden olur.

Teşhis:

Yığın izlemeye bakarak istisnanın ne olduğunu öğrenebilir ve daha ayrıntılı hata bilgileri için Logcat'i kontrol edebilirsiniz. Bu durumda Logcat'te aşağıdaki hata mesajı gösterilir:

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

Düzeltme:

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

Ön plan hizmetlerinizin Service.onTimeout(int,int) uygulamasını sağlayın. Bu yöntemi uygularken stopSelf() yöntemini hemen çağırdığınızdan emin olun.

Dahili istisna: ForegroundServiceDidNotStartInTimeException

context.startForegroundService() yöntemini çağırarak bir hizmet başlattığınızda bu hizmetin ServiceCompat.startForeground() yöntemini çağırarak kendisini ön plan hizmetine yükseltmek için birkaç saniyesi olur. Hizmet bunu yapmazsa dahili bir ForegroundServiceDidNotStartInTimeException hatası verir.

Teşhis:

Yığın izlemeye bakarak istisnanın ne olduğunu öğrenebilir ve daha ayrıntılı hata bilgileri için Logcat'i kontrol edebilirsiniz. Bu durumda Logcat'te aşağıdaki hata mesajı gösterilir:

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() yöntemini çağırdığından emin olun.

WorkManager:

Bu istisnayı, ön plan hizmeti yürüten (setForegound veya setForegroundAsync çağrısı yapan) WorkManager çalışanlarda da görebilirsiniz. Daha önce çalışan bir ön plan hizmeti kapanmaya çalışırken başka bir çalışan ön plan hizmeti başlatmaya çalıştığında iki ön plan çalışanının yaşam döngüsü çakışır. Bu kilitlenmeye aşağıdaki günlük eşlik eder:

Re-initializing SystemForegroundService after a request to shut-down

Bu kilitlenmeye yönelik düzeltme, WorkManager 2.10.5 sürümünde kullanıma sunuldu.

Uygulamanız bu istisnayla karşılaşıyorsa WorkManager'ın en son sürümüne güncelleyin ve devam eden sorunları WorkManager sorun izleyicisine bildirin.

ForegroundServiceStartNotAllowedException

Hata:

Sistem ForegroundServiceStartNotAllowedException hatası veriyor.

Neden:

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

Android 12'den (API düzeyi 31) itibaren, birkaç özel istisna dışında uygulamaların arka planda çalışırken ön plan hizmetlerini başlatmasına izin verilmez. Arka plandan ön plan hizmeti başlatmaya çalışırsanız ve muafiyetlerden birinin şartlarını karşılamıyorsanız sistem ForegroundServiceStartNotAllowedException hatası verir. Muafiyet koşullarını karşılamıyorsanız da sistem bu işlemi yapar.

Örneğin, bir uygulamada kullanıcının tıklayabileceği bir düğme olabilir. Bu düğme tıklandığında uygulama bazı işlemler yapar ve ardından bir ön plan hizmeti başlatır. Bu durumda, kullanıcının düğmeyi tıklayıp uygulamayı hemen arka plana alma tehlikesi vardır. Uygulama daha sonra hizmeti arka plandan başlatmaya çalışıyordu. Uygulama, belirtilen muafiyetlerden birini karşılamıyorsa sistem ForegroundServiceStartNotAllowedException hatası verir.

Ayrıca, bazı muafiyetlerin 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 süreli bir muafiyet uygulanır. Hizmeti yeterince hızlı başlatmazsanız ForegroundServiceStartNotAllowedException alırsınız.

Belirli muafiyetler, yeni Android sürümleriyle bazen daha kısıtlayıcı hale gelir. Uygulamanızın hedeflediği Android sürümünü değiştirdiyseniz ön plan hizmetlerindeki değişiklikler ile ilgili dokümanları inceleyin ve uygulamanızın izin verilen istisnalardan birini hâlâ 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 yaşam döngüsüne duyarlı bileşenleri kullanabilirsiniz. Böylece yanlışlıkla arka plandan ön plan hizmeti başlatmaya çalışmazsınız.

SecurityException

Hata:

Sistem SecurityException 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şlatmak için FOREGROUND_SERVICE iznine sahip olması gerekir.
  • Android 14 (API düzeyi 34) veya sonraki sürümleri hedefleyen uygulamaların, ön plan hizmeti türüyle ilgili tüm ön koşulları karşılaması gerekir. Bu ön koşullar, ön plan hizmet türleri dokümanlarında ayrıntılı olarak açıklanmıştır. Özellikle aşağıdaki koşullara dikkat edin:
    • Bazı ön plan hizmet türleri, çalışma zamanında istenen belirli izinleri gerektirir. Örneğin, uzaktan mesajlaşma ön plan hizmetinin FOREGROUND_SERVICE_REMOTE_MESSAGING izni olmalıdır.
  • Bazı durumlarda, ön plan hizmet türlerinin ihtiyaç duyduğu izinlerle ilgili ek kullanım kısıtlamaları vardır. Bu izinler, yalnızca uygulama ön plandayken verilir (birkaç istisna dışında). Bu, uygulamanız bu izinlerden birini talep edip almış olsa bile, uygulama arka plandayken ön plan hizmetini başlatmaya çalışırsa uygulamanın arka plandan ön plan hizmeti başlatma muafiyeti olsa bile sistemin SecurityException hatası vereceği anlamına gelir. Daha fazla bilgi için Kullanım sırasında izin gerektiren ön plan hizmetlerini başlatmayla ilgili kısıtlamalar başlıklı makaleyi inceleyin.
    • Gerekli izinleri istemenize rağmen ön plan hizmetini, gerekli izinlerin verildiğini onaylamadan başlatırsanız SecurityException hatası alabilirsiniz.

Düzeltme:

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