Ö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 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 uygunsuz şekilde kullanılırsa cihaz performansı ve pil ömrü olumsuz etkilenebilir. Bu nedenle, Android platform sürümlerinde bu olumsuz etkileri sınırlamak için genellikle ön plan hizmeti 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ümanını inceleyerek sorunlarınızı açıklayabilecek yeni değişiklikler olup olmadığını kontrol etmeniz gerekir. Aşağıdaki durumlarda değişiklik olup olmadığını kontrol etmek özellikle önemlidir:

  • Daha önce çalışan ön plan hizmeti kodu artık başarısız oluyor
  • 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 önizlemesi belgelerinin en son sürümünü kontrol ettiğinizden emin olun.

Uygulama yanıt vermiyor (ANR) hataları

Belirli durumlarda bir 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ışarak ANR'ye neden oluyor

short service 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() numaralı telefonu araması için birkaç saniye verilir. Hizmet kendi kendini durdurmazsa sistem, Uygulama Yanıt Vermiyor hatasını tetikler.

Teşhis:

ANR, ön plan hizmetinin kendini durduramaması nedeniyle oluştuysa sistem dahili bir istisna oluşturur. ANR raporlarını kontrol ederek sorunun bu olduğunu 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:

Zaman sınırlı tüm ön plan hizmetlerinin işlerini tamamladığından ve sistem zaman sınırı içinde stopForeground(int) işlevini çağırdığından emin olun.

Ön plan hizmetleriniz Service.onTimeout(int,int) işlevini uygulamalıdır. Bu yöntemin uygulanmasında stopSelf() işlevinin hemen çağrıldığından 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ı aşıldı

Sistem, uygulama arka plandayken veri senkronizasyonu ve medya işleme ön plan hizmetlerinin ne kadar süreyle çalışabileceğine ilişkin bir sınır uygular. Hizmet bu sınırı aşarsa sistem, hizmetin Service.onTimeout(int,int) yöntemini çağırır. Hizmetin stopSelf() numaralı telefonu araması için birkaç saniyesi vardır. Hizmet kendi kendine durmazsa sistem, uygulamanın kilitlenmesine neden olan dahili bir RemoteServiceException oluşturur.

Teşhis:

İstisnanın ne olduğunu yığın izlemeye bakarak öğ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:

Zaman sınırlı tüm ön plan hizmetlerinin işlerini bitirdiğinden ve sistem zaman sınırı içinde stopForeground(int) işlevini çağırdığından emin olun.

Ön plan hizmetleriniz Service.onTimeout(int,int) işlevini uygulamalıdır. Bu yöntemin uygulanmasında stopSelf() işlevinin hemen çağrıldığından emin olun.

Dahili istisna: ForegroundServiceDidNotStartInTimeException

context.startForegroundService() işlevini çağırarak bir hizmet başlattığınızda bu hizmetin, ServiceCompat.startForeground() işlevini çağırarak kendini ön plan hizmetine yükseltmek için birkaç saniyesi vardır. Hizmet bunu yapmazsa dahili ForegroundServiceDidNotStartInTimeException oluşturur.

Teşhis:

İstisnanın ne olduğunu yığın izlemeye bakarak öğ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() çağırdığından emin olun.

ForegroundServiceStartNotAllowedException

Hata:

Sistem ForegroundServiceStartNotAllowedException hatası veriyor.

Neden:

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

Android 12 (API düzeyi 31) sürümünden itibaren, uygulama arka planda çalışırken ön plan hizmetlerinin başlatılmasına izin verilmez. Bu kuralın bazı istisnaları vardır. Arka plandan ön plan hizmeti başlatmaya çalışırsanız ve muafiyetlerden birinin şartlarını karşılamıyorsanız sistem ForegroundServiceStartNotAllowedException istisnası oluşturur. Sistem, muafiyet koşullarını karşılamadığınız durumlarda da bu işlemi yapar.

Örneğin, bir uygulamada kullanıcının tıklayabileceği bir düğme olabilir. Bu düğme, uygulamanın bazı işlemler 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 alma tehlikesi vardır. Uygulama daha sonra hizmeti arka plandan başlatmaya çalışır. Uygulama belirtilen muafiyetlerden birini karşılamıyorsa sistem ForegroundServiceStartNotAllowedException hatası verir.

Ayrıca, bazı muafiyetler kısa bir süreyle sınırlıdır. Örneğin, uygulamanız yüksek öncelikli bir FCM mesajına yanıt olarak ön plan hizmeti başlattığında kısa süreli bir muafiyet söz konusudur. 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 gelir. Uygulamanızın hedeflediği Android sürümünü değiştirdiyseniz ön planda hizmetlerde yapılan değişiklikler dokümanını inceleyin ve uygulamanızın hâlâ izin verilen muafiyetlerden birini karşıladığını onaylayı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şenler kullanabilirsiniz. Böylece, arka plandan ön plan hizmetini yanlışlıkla başlatmaya çalışmazsınız.

SecurityException

Hata:

Sistem SecurityException hatası veriyor.

Neden:

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

  • Android 9'u (API düzeyi 28) veya sonraki sürümleri hedefleyen uygulamalarda ön plan hizmeti başlatmak için FOREGROUND_SERVICE izni bulunmalıdır.
  • Android 14'ü (API düzeyi 34) veya sonraki sürümleri hedefleyen uygulamalar, ön plan hizmeti türüyle ilgili tüm ön koşulları karşılamalıdır. Bu ön koşullar, ön plan hizmeti türleri dokümanında ayrıntılı olarak açıklanmıştır. Özellikle aşağıdaki koşullara dikkat edin:
    • Bazı ön plan hizmeti türleri için belirli çalışma zamanı izinleri gerekir. Örneğin, uzaktan mesajlaşma ön plan hizmetinin FOREGROUND_SERVICE_REMOTE_MESSAGING iznine sahip olması gerekir.
  • Bazı durumlarda, belirli ön plan hizmeti türlerinin ihtiyaç duyduğu izinlerle ilgili ek kullanım sırasında kısıtlamaları vardır. Bu izinler yalnızca uygulama ön plandayken (birkaç özel istisna dışında) uygulamaya verilir. Bu nedenle, uygulamanız bu izinlerden birini istemiş ve bu izin verilmiş olsa bile uygulama arka plandayken ön plan hizmetini başlatmaya çalışırsa sistem, uygulamanın arka plandan ön plan hizmeti başlatma muafiyeti olsa bile SecurityException oluşturur. 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 istediyseniz ancak ön plan hizmetini, gerekli izinlerin verildiğini onaylamadan önce başlatırsanız SecurityException alabilirsiniz.

Düzeltme:

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