Arka Plan Yürütme Sınırları

Bir uygulama arka planda çalıştığında, RAM gibi cihazın sınırlı kaynaklarının bir kısmını tüketir. Bu durum, özellikle kullanıcı oyun oynamak veya video izlemek gibi kaynakları yoğun bir şekilde kullanan bir uygulama kullanıyorsa kullanıcı deneyiminin bozulmasına yol açabilir. Android 8.0 (API düzeyi 26), kullanıcı deneyimini iyileştirmek için uygulamaların arka planda çalışırken neler yapabileceğine ilişkin sınırlamalar getirir. Bu belgede, işletim sistemindeki değişiklikler ve uygulamanızı yeni sınırlamalar kapsamında iyi çalışacak şekilde nasıl güncelleyebileceğiniz açıklanmaktadır.

Genel bakış

Birçok Android uygulaması ve hizmeti aynı anda çalışabilir. Örneğin, bir kullanıcı başka bir pencerede web'e göz atarken bir pencerede oyun oynuyor ve müzik çalmak için üçüncü bir uygulama kullanıyor olabilir. Aynı anda ne kadar fazla uygulama çalışırsa sisteme o kadar fazla yük yüklenir. Arka planda ek uygulamalar veya hizmetler çalışıyorsa bu durum sisteme ek yük yükler ve bu da kötü kullanıcı deneyimine yol açabilir; örneğin, müzik uygulamasının aniden kapanmasına yol açabilir.

Android 8.0, bu sorunların yaşanma ihtimalini azaltmak için uygulamaların kullanıcılarla doğrudan etkileşimde olmadığı zamanlarda neler yapabileceğine sınırlamalar getirir. Uygulamalar iki şekilde kısıtlanır:

  • Arka Plan Hizmeti Sınırlamaları: Bir uygulama boştayken arka plan hizmetlerini kullanmayla ilgili sınırlamalar olur. Bu, kullanıcının daha kolay fark edebileceği ön plan hizmetleri için geçerli değildir.

  • Yayın Sınırlamaları: Sınırlı istisnalar dışında, uygulamalar örtülü yayınlara kaydolmak için manifestlerini kullanamaz. Bu yayınlara çalışma zamanında yine kaydolabilirler ve özel olarak uygulamalarını hedefleyen uygunsuz yayınlara kaydolmak için manifestleri kullanabilirler.

Çoğu durumda, uygulamalar JobScheduler işlerini kullanarak bu sınırlamaları önleyebilir. Bu yaklaşım, uygulamanın aktif olarak çalışmadığı zamanlarda iş yapmak için ayarlamasına olanak tanır. Ancak yine de sisteme bu işleri kullanıcı deneyimini etkilemeyecek şekilde planlaması için zaman tanır. Android 8.0, JobScheduler özelliğinde, hizmetlerin ve yayın alıcılarının planlanmış işlerle değiştirilmesini kolaylaştıran çeşitli iyileştirmeler sunmaktadır. Daha fazla bilgi için JobScheduler iyileştirmeleri sayfasını inceleyin.

Arka Plan Hizmet Sınırlamaları

Arka planda çalışan hizmetler, cihaz kaynaklarını tüketerek daha kötü bir kullanıcı deneyimine neden olabilir. Sistem, bu sorunu azaltmak amacıyla hizmetlere bazı sınırlamalar uygular.

Sistem, ön plan ve arka plan uygulamalarını birbirinden ayırır. (Hizmet sınırlamaları için arka planın tanımı, bellek yönetimi tarafından kullanılan tanımdan farklıdır. Bir uygulama bellek yönetimi açısından arka planda, hizmetleri başlatma becerisi açısından ise ön planda olabilir.) Aşağıdakilerden herhangi biri geçerliyse uygulamanın ön planda olduğu kabul edilir:

  • Başlatılmış veya duraklatılmış olsun, görünür bir etkinliği vardır.
  • Ön plan hizmeti vardır.
  • Başka bir ön plan uygulaması, hizmetlerinden birine bağlanarak veya içerik sağlayıcılarından birini kullanarak uygulamaya bağlanır. Örneğin, aşağıdaki uygulamalara başka bir uygulama bağlanırsa uygulama ön plandadır:
    • IME
    • Duvar kağıdı hizmeti
    • Bildirim dinleyici
    • Ses veya kısa mesaj hizmeti

Bu koşulların hiçbiri doğru değilse uygulamanın arka planda olduğu kabul edilir.

Not: Bu kurallar bağlı hizmetleri hiçbir şekilde etkilemez. Uygulamanız bağlı bir hizmeti tanımlıyorsa uygulamanızın ön planda olup olmaması fark etmeksizin diğer bileşenler bu hizmete bağlanabilir.

Bir uygulama ön plandayken hem ön hem de arka plan hizmetlerini özgürce oluşturup çalıştırabilir. Bir uygulama arka plana gittiğinde, hizmet oluşturmasına ve kullanmasına hâlâ izin verilen birkaç dakikalık bir süre bulunur. Bu sürenin sonunda uygulama boşta olarak kabul edilir. Bu sırada sistem, uygulamanın arka plan hizmetlerini, uygulama, hizmetlerin Service.stopSelf() yöntemlerini çağırmış gibi durdurur.

Belirli koşullar altında arka plan uygulamaları birkaç dakikalığına geçici bir izin verilenler listesine yerleştirilir. Bir uygulama izin verilenler listesindeyken sınırlama olmaksızın hizmetleri başlatabilir ve arka plan hizmetlerinin çalışmasına izin verilir. Bir uygulama, kullanıcının görebildiği bir görevi gerçekleştirdiğinde izin verilenler listesine eklenir. Örneğin:

Not: IntentService bir hizmettir ve bu nedenle arka plan hizmetleriyle ilgili yeni kısıtlamalara tabidir. Bu nedenle, IntentService kullanan birçok uygulama Android 8.0 veya sonraki sürümleri hedeflerken düzgün çalışmaz. Bu nedenle Android Destek Kitaplığı 26.0.0, IntentService ile aynı işlevi sağlayan ancak Android 8.0 veya sonraki sürümlerde çalışırken hizmetler yerine işler kullanan yeni bir JobIntentService sınıfını kullanıma sunuyor.

Uygulamanız çoğu durumda arka plan hizmetlerini JobScheduler işleriyle değiştirebilir. Örneğin, CoolPhotoApp, uygulama ön planda çalışmıyor olsa bile kullanıcının arkadaşlarından paylaşılan fotoğraflar alıp almadığını kontrol etmelidir. Daha önce uygulama, bulut depolama alanını kontrol eden bir arka plan hizmetini kullanıyordu. Geliştirici, Android 8.0'a (API düzeyi 26) geçiş için arka plan hizmetini planlanmış bir işle değiştirir. Planlanmış iş düzenli olarak başlatılır, sunucuyu sorgular ve ardından çıkış yapar.

Android 8.0'dan önce, ön plan hizmeti oluşturmanın normal yolu bir arka plan hizmeti oluşturup ardından bu hizmeti ön plana tanıtmaktı. Android 8.0'da bir komplikasyon vardır; sistem, arka plan uygulamalarının arka plan hizmeti oluşturmasına izin vermez. Bu nedenle, Android 8.0 ön planda yeni bir hizmet başlatmak için startForegroundService() yeni yöntemini kullanıma sunar. Sistem hizmeti oluşturduktan sonra, yeni hizmetin kullanıcılar tarafından görülebilen bildirimini göstermek için uygulamanın, hizmetin startForeground() yöntemini çağırması için beş saniyesi vardır. Uygulama, zaman sınırı dahilinde startForeground() çağrısını yapmazsa sistem hizmeti durdurur ve uygulamayı ANR olarak bildirir.

Yayın Sınırlamaları

Bir uygulama yayınları almak için kaydolursa uygulamanın alıcısı, yayın her gönderildiğinde kaynakları tüketir. Bu durum, çok fazla uygulamanın sistem olaylarına dayalı yayın almak için kaydolduğu durumlarda sorunlara yol açabilir. Bir yayını tetikleyen sistem olayları, tüm bu uygulamaların kaynakları hızlı bir şekilde tüketmesine neden olarak kullanıcı deneyimini olumsuz yönde etkileyebilir. Android 7.0 (API düzeyi 24), bu sorunu azaltmak için yayınlara Arka Plan Optimizasyonu'nda açıklandığı gibi sınırlamalar getirmiştir. Android 8.0 (API düzeyi 26), bu sınırlamaları daha katı hale getirir.

  • Android 8.0 veya sonraki sürümleri hedefleyen uygulamalar artık manifest dosyalarında örtülü yayınlar için yayın alıcılarını kaydedemez. Dolaylı yayın, söz konusu uygulamayı özel olarak hedeflemeyen bir yayındır. Örneğin ACTION_PACKAGE_REPLACED, cihazdaki bir paketlerin değiştirildiğini bildiren tüm kayıtlı dinleyicilere gönderildiği için örtülü bir yayındır. Ancak ACTION_MY_PACKAGE_REPLACED, yalnızca paketi değiştirilen uygulamaya gönderildiği için örtülü bir yayın değildir. Bu yayın için dinleyici kaydeden başka kaç uygulamanın olduğu önemli değildir.
  • Uygulamalar, manifest dosyalarında müstehcen yayınları kaydettirmeye devam edebilir.
  • Uygulamalar, kapalı veya açık herhangi bir yayın için bir alıcıyı kaydetmek üzere çalışma zamanında Context.registerReceiver() özelliğini kullanabilir.
  • İmza izni gerektiren yayınlar, cihazdaki tüm uygulamalara değil, yalnızca aynı sertifikayla imzalanan uygulamalara gönderildiğinden bu kısıtlamadan muaftır.

Çoğu durumda, daha önce dolaylı bir yayına kaydolan uygulamalar JobScheduler işi kullanarak benzer işlevler elde edebilir. Örneğin, bir sosyal fotoğraf uygulamasının zaman zaman verilerini temizlemesi ve bunu cihaz bir şarj cihazına bağlıyken yapmayı tercih etmesi gerekebilir. Daha önce uygulama, manifest dosyasında ACTION_POWER_CONNECTED için bir alıcı kaydediyordu. Uygulama bu yayını aldığında temizlemenin gerekli olup olmadığını kontrol ediyordu. Uygulama, Android 8.0 veya sonraki bir sürüme geçiş yapmak için ilgili alıcıyı manifest dosyasından kaldırır. Bunun yerine, uygulama cihaz boşta ve şarj olurken çalışan bir temizleme işi planlar.

Not: Bazı örtülü yayınlar şu anda bu sınırlamadan muaftır. Uygulamalar, hangi API düzeyini hedeflediğine bakılmaksızın, bu yayınlar için alıcıları manifest dosyalarında kaydetmeye devam edebilir. Muaf tutulan yayınların listesi için Dolaylı Yayın İstisnaları bölümüne bakın.

Taşıma Rehberi

Varsayılan olarak, bu değişiklikler yalnızca Android 8.0 (API düzeyi 26) veya sonraki sürümleri hedefleyen uygulamaları etkiler. Ancak, uygulama 26'dan düşük bir API düzeyini hedeflese bile kullanıcılar, Ayarlar ekranından herhangi bir uygulama için bu kısıtlamaları etkinleştirebilir. Yeni sınırlamalara uymak için uygulamanızı güncellemeniz gerekebilir.

Uygulamanızın hizmetleri nasıl kullandığını kontrol edin. Uygulamanız boşta kaldığında arka planda çalışan hizmetlerden yararlanıyorsa bunları değiştirmeniz gerekir. Olası çözümler şunlardır:

  • Uygulamanızın arka plandayken ön plan hizmeti oluşturması gerekiyorsa startService() yerine startForegroundService() yöntemini kullanın.
  • Kullanıcı hizmeti fark ediyorsa bunu ön plan hizmeti yapın. Örneğin, ses çalan bir hizmet her zaman ön plan hizmeti olmalıdır. Hizmeti startService() yerine startForegroundService() yöntemini kullanarak oluşturun.
  • Hizmetin işlevselliğini planlanmış bir işle kopyalamanın yolunu bulun. Hizmet, kullanıcının hemen fark edebileceği bir şeyi yapmıyorsa genellikle bunun yerine planlanmış bir iş kullanabilirsiniz.
  • FCM'yi kullanarak arka planda yoklama yapmak yerine ağ etkinlikleri gerçekleştiğinde uygulamanızı seçerek uyandırabilirsiniz.
  • Arka plandaki çalışmayı, uygulama kendiliğinden ön plana geçene kadar erteleyin.

Uygulamanızın manifest dosyasında tanımlanan yayın alıcılarını inceleyin. Manifest dosyanızda dolaylı yayın için bir alıcı belirtilmişse bunu değiştirmeniz gerekir. Olası çözümler şunlardır:

  • Manifest'te alıcıyı tanımlamak yerine Context.registerReceiver() yöntemini çağırarak çalışma zamanında alıcıyı oluşturun.
  • Örtülü yayını tetikleyecek koşulu kontrol etmek için planlanmış bir iş kullanın.