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

Bir uygulama arka planda çalıştığında, RAM gibi cihazın sınırlı kaynaklarından bazılarını tüketir. Bu durum, özellikle kullanıcı oyun oynamak veya video izlemek gibi kaynakları yoğun olarak kullanan bir uygulama kullanıyorsa kullanıcı deneyiminin bozulmasına yol açabilir. Android 8.0, kullanıcı deneyimini iyileştirmek için (API düzeyi 26), uygulamaların arka planda çalışırken yapabileceği işlemlere sınırlamalar getirir. Bu belgede, işletim sistemindeki değişiklikler ve uygulamanızı yeni sınırlamalara uygun şekilde çalışmak için 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ı bir pencerede oyun oynarken başka bir pencerede web'e göz atarken müzik çalmak için üçüncü bir uygulama kullanıyor olabilir. Aynı anda ne kadar çok uygulama çalışırsa sisteme o kadar fazla yük yüklenir. Arka planda ek uygulamalar veya hizmetler çalışıyorsa sisteme ek yük biner. Bu da kötü bir kullanıcı deneyimine yol açabilir. Örneğin, müzik uygulaması aniden kapatılabilir.

Android 8.0, bu sorunların yaşanma ihtimalini azaltmak için, kullanıcıların doğrudan etkileşimde bulunmadıkları uygulamaların yapabileceklerine 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 vardır. Bu durum, 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 manifest dosyalarını kullanamaz. Bu yayınlara çalışma zamanında yine kaydolabilirler ve özel olarak uygulamalarını hedefleyen açık yayınlara ve yayınlara kaydolmak için manifest'i kullanabilirler.

Çoğu durumda, uygulamalar JobScheduler işlerini kullanarak bu sınırlamaların üstesinden gelebilir. Bu yaklaşım, uygulamanın aktif olarak çalışmadığı zamanlarda yapılacak işleri ayarlamasına olanak tanır ancak yine de sisteme, bu işleri kullanıcı deneyimini etkilemeyecek şekilde programlaması için zaman tanır. Android 8.0, JobScheduler özelliğinde, hizmetlerin ve yayın alıcılarının planlanan işlerle değiştirilmesini kolaylaştıran çeşitli iyileştirmeler sunar. Daha fazla bilgi için JobScheduler iyileştirmeleri bölümüne bakın.

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 için hizmetlere bazı kısıtlamalar uygular.

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

  • Etkinlik 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, şunlara başka bir uygulama bağlanıyorsa uygulama ön plandadır:
    • IME
    • Duvar kağıdı hizmeti
    • Bildirim dinleyici
    • Ses veya kısa mesaj hizmeti

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

Bir uygulama ön plandayken hem ön plan hem de arka plan hizmetlerini serbest bir şekilde oluşturup çalıştırabilir. Arka plana giren bir uygulama, birkaç dakikalık bir süre içinde hizmet oluşturup kullanmasına izin verilir. Bu sürenin sonunda uygulamanın boşta olduğu 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 herhangi bir sınırlama olmaksızın hizmet başlatabilir ve arka plan hizmetlerinin çalışmasına izin verilir. Bir uygulama, kullanıcının görebileceğ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, uygulama ön planda çalışmıyor olsa bile, CoolPhotoApp'in kullanıcının arkadaşlarından paylaşılan fotoğraf alıp almadığını kontrol etmesi gerekir. Uygulama daha önce, bulut depolama alanını kontrol eden bir arka plan hizmeti kullanıyordu. Geliştirici, Android 8.0'a (API düzeyi 26) geçmek için arka plan hizmetini düzenli olarak başlatılan planlı bir işle değiştirir, sunucuyu sorgular ve daha sonra çıkış yapar.

Android 8.0'dan önce bir ö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 sorun vardır. Sistem, arka plan uygulamalarının arka plan hizmeti oluşturmasına izin vermez. Bu nedenle, Android 8.0'da ön planda yeni bir hizmet başlatmak için yeni startForegroundService() yöntemi kullanılır. Sistem hizmeti oluşturduktan sonra, uygulamanın yeni hizmetin kullanıcılar tarafından görülebilen bildirimini göstermek için beş saniyesi içinde hizmetin [startForeground()](/reference/android/app/Service#startForeground(int, android.app.Notification)) yöntemini çağırması gerekir. Uygulama, zaman sınırı dahilinde startForeground()'i çağırmazsa sistem hizmeti durdurur ve uygulamanın ANR olduğunu bildirir.

Yayın Sınırlamaları

Bir uygulama yayın almak için kaydolursa uygulamanın alıcısı, her yayın gönderildiğinde kaynakları tüketir. Bu durum, sistem olaylarına dayalı yayın almak için çok fazla uygulama kaydettirilirse sorunlara yol açabilir. Bir yayını tetikleyen sistem olayı, 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 bölümünde açıklandığı gibi sınırlamalar getirmiştir. Android 8.0 (API düzeyi 26) bu sınırlamaları daha katı hale getirmektedir.

  • Android 8.0 veya sonraki sürümleri hedefleyen uygulamalar, yayın özel olarak bu uygulamayla kısıtlanmadığı sürece manifest dosyalarındaki örtülü yayınlar için artık yayın alıcılarını kaydedemez. Örtülü yayın, bir uygulama içindeki belirli bir bileşeni hedeflemeyen yayındır. Örneğin, ACTION_PACKAGE_REPLACED tüm uygulamalarda kayıtlı tüm dinleyicilere gönderilerek cihazdaki bir paketin değiştirildiği bildirilir. Yayın, dolaylı yoldan yapıldığından 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 yayınlanır.
  • Uygulamalar, manifest dosyalarında uygunsuz yayınlara kaydolmaya devam edebilir.
  • Uygulamalar, ister örtülü veya açık olsun tüm yayınlar için bir alıcıyı kaydettirmek amacıyla çalışma zamanında Context.registerReceiver() aracını kullanabilir.
  • İmza izni gerektiren yayınlar, cihazdaki tüm uygulamalara değil, yalnızca aynı sertifikayla imzalanmış uygulamalara gönderildiğinden bu kısıtlamadan muaftır.

Çoğu durumda, daha önce dolaylı bir yayına kaydolan uygulamalar bir JobScheduler işi kullanarak benzer işlevlerden yararlanabilir. Örneğin, bir sosyal medya fotoğrafı uygulamasının, verilerini zaman zaman temizlemesi gerekebilir ve bu işlemi cihaz bir şarj cihazına bağlıyken yapmayı tercih edebilir. Daha önce uygulama, manifest dosyasına 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 bu alıcıyı manifest dosyasından kaldırır. Bunun yerine uygulama, cihaz boşta ve şarj olurken çalışacak 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ı görmek için kontrol edin. Uygulamanız boştayken 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 ö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 çoğaltmanın bir yolunu bulun. Hizmet, kullanıcının hemen fark edebileceği bir işlemi gerçekleştirmiyorsa genellikle bunun yerine planlanmış bir iş kullanabilirsiniz.
  • Arka planda yoklama yapmak yerine, ağ etkinlikleri gerçekleştiğinde uygulamanızı seçerek uyandırmak için FCM'yi kullanın.
  • Arka plan çalışmasını, uygulama doğal olarak ö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ı belirtiyorsa bunu değiştirmeniz gerekir. Olası çözümler şunlardır:

  • Alıcıyı çalışma zamanında manifest dosyasında tanımlamak yerine Context.registerReceiver() çağrısı yaparak oluşturun.
  • Örtülü yayını tetikleyecek koşulu kontrol etmek için planlanmış bir iş kullanın.