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. Kullanıcılar bu yayınlara çalışma zamanında yine kaydolabilir ve manifest dosyasını kullanarak özel olarak uygulamalarını hedefleyen açık yayınlara ve yayınlara kaydolabilirler.

Ç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.

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:

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 yeni startForegroundService() yöntemini kullanıma sunar. Sistem hizmeti oluşturduktan sonra, uygulamanın yeni hizmetin kullanıcı tarafından görülebilen bildirimini göstermek için hizmetin [startForeground()](/reference/android/app/Service#startForeground(int, android.app.Bildirim) yöntemini çağırması için beş saniyesi vardır. Uygulama, zaman sınırı dahilinde startForeground()'i çağırmıyorsa 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, yayın özel olarak bu uygulamayla kısıtlanmadığı sürece artık manifest dosyalarındaki örtülü yayınlar için yayın alıcılarını kaydedemez. Kapalı yayın, bir uygulama içindeki belirli bir bileşeni hedeflemeyen bir yayındır. Örneğin, ACTION_PACKAGE_REPLACED tüm uygulamalarda kayıtlı tüm dinleyicilere gönderilir ve böylece cihazdaki bir paketin değiştirildiği bildirilir. Yayın, örtülü olduğu için Android 8.0 veya sonraki sürümleri hedefleyen uygulamalardaki manifest kayıtlı alıcılara yayınlanmaz. ACTION_MY_PACKAGE_REPLACED aynı zamanda örtülü bir yayındır ancak yalnızca paketi değiştirilen uygulamaya gönderildiğinden manifest kayıtlı alıcılara iletilir.
  • Uygulamalar, manifest dosyalarında müstehcen yayınları kaydettirmeye devam edebilir.
  • Uygulamalar, dolaylı veya açık herhangi bir yayın için bir alıcıyı kaydettirmek üzere çalışma zamanında Context.registerReceiver()'i 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şlevlerden yararlanabilir. Ö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.

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 etkilenen örtülü yayın için bir alıcı belirtilmişse bunu değiştirmeniz gerekir. Olası çözümler şunlardır:

  • Manifest'te alıcıyı belirtmek yerine Context.registerReceiver() çağrısı yaparak ç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.