Arka plan görevlerine genel bakış

Uygulamalar genellikle aynı anda birden fazla şey yapmak ister. Android API'leri bunu yapmanızı sağlayacak birçok farklı yol sunar. Doğru seçeneği belirlemek çok önemlidir; bir seçenek bir durum için doğruyken başka bir durum için çok yanlış olabilir. Yanlış API'lerin seçilmesi uygulamanızın performansına veya kaynak verimliliğine zarar verebilir. Bu da pili tüketip genel olarak kullanıcının cihazının performansını düşürebilir. Bazı durumlarda, yanlış yaklaşımın seçilmesi uygulamanızın Play Store'da listelenmesini engelleyebilir.

Bu belge, kullanabileceğiniz farklı seçenekleri açıklamakta ve durumunuza uygun seçeneği belirlemenize yardımcı olmaktadır.

Terminoloji

Arka plan görevleriyle ilgili bazı önemli terimler birbiriyle çelişen şekilde birden fazla şekilde kullanılabilir. Bu nedenle, şartlarımızı tanımlamak önemlidir.

Bir uygulama arka planda çalışıyorsa sistem, uygulamaya bir dizi kısıtlama uygular. (Örneğin, çoğu durumda arka planda bir uygulama ön plan hizmetlerini başlatamaz.)

Bu belgede, bir uygulamanın ana iş akışının dışında gerçekleştirdiği bir işlemi belirtmek için "görev" terimini kullanacağız. Konuların daha iyi anlaşılmasını sağlamak için bunu üç ana görev türüne ayırdık: eşzamansız iş, görev planlama API'leri ve ön plan hizmetleri.

Doğru seçeneği belirleyin

Çoğu senaryoda görevin kapsamına giren kategoriyi (eşzamansız iş, görev planlama API'leri veya ön plan hizmetleri) belirleyerek göreviniz için kullanılacak doğru API'leri bulabilirsiniz.

Yine de emin değilseniz, karara daha fazla nüans katan, sağladığımız akış şemalarını kullanabilirsiniz. Bu seçeneklerin her biri, bu dokümanın ilerleyen kısımlarında daha ayrıntılı olarak açıklanmıştır.

Arka plan görevleri için dikkate alınması gereken iki ana senaryo vardır:

Bu iki senaryonun kendi karar ağaçları vardır.

Eşzamansız çalışma

Çoğu durumda, bir uygulamanın ön planda çalışırken yalnızca eşzamanlı işlem yapması gerekir. Örneğin, bir uygulamanın zaman alan bir hesaplama yapması gerekebilir. Hesaplama kullanıcı arayüzü iş parçacığı üzerinde yapılırsa hesaplama tamamlanana kadar kullanıcı uygulamayla etkileşimde bulunamaz. Bu durum, ANR hatasına neden olabilir. Böyle bir durumda, uygulamanın bir eşzamansız çalışma seçeneği kullanması gerekir.

Yaygın eşzamansız çalışma seçenekleri arasında Kotlin eş yordamları ve Java iş parçacıkları bulunur. Eşzamansız çalışma belgelerinde daha fazla bilgi bulabilirsiniz. Arka plan görevi API'lerinin aksine, uygulama geçerli bir yaşam döngüsü aşamasında kalmazsa (örneğin uygulama ön plandan ayrılırsa) eşzamansız çalışmanın tamamen biteceğinin garanti edilmediğini unutmayın.

Görev planlama API'leri

Görev planlama API'leri, kullanıcı uygulamadan ayrılsa bile devam etmesi gereken görevleri gerçekleştirmeniz gerektiğinde daha esnek bir seçenektir. Çoğu durumda, arka plan görevlerini çalıştırmak için en iyi seçenek WorkManager'ı kullanmaktır. Ancak bazı durumlarda platform JobScheduler API'yi kullanmak uygun olabilir.

WorkManager, basit veya karmaşık işleri ihtiyacınıza göre ayarlamanıza olanak tanıyan güçlü bir kitaplıktır. Görevleri belirli zamanlarda çalışacak şekilde planlamak veya görevin ne zaman çalışması gerektiğini belirtmek için WorkManager'ı kullanabilirsiniz. Görevlerden oluşan zincirler bile oluşturabilirsiniz. Böylece her görev sırayla çalışarak sonuçlarını bir sonrakine iletir. Mevcut tüm seçenekleri anlamak için WorkManager özellik listesini okuyun.

Arka plan görevleriyle ilgili en yaygın senaryolardan bazıları şunlardır:

  • Sunucudan düzenli aralıklarla veri alma
  • Sensör verileri getiriliyor (örneğin, adım sayacı verileri)
  • Periyodik konum verilerini alma (Android 10 veya sonraki sürümlerde ACCESS_BACKGROUND_LOCATION izni almanız gerekir)
  • Kamera tarafından oluşturulan fotoğraflar gibi bir içeriği tetikleyiciye dayalı içerik yüklemek

Ön plan hizmetleri

Ön plan hizmetleri, kesintiye uğramaması gereken görevleri anında yürütmenin etkili bir yoludur. Ancak ön plan hizmetleri, cihaza ağır bir yük yükleyebilir ve bazen gizlilik ve güvenlikle ilgili sonuçlar doğurabilir. Bu nedenlerle, sistem uygulamaların ön plan hizmetlerini nasıl ve ne zaman kullanabileceği konusunda birçok kısıtlama uygular. Örneğin, bir ön plan hizmetinin kullanıcı tarafından fark edilebilir olması gerekir ve çoğu durumda uygulamalar arka plandayken uygulamalar ön plan hizmetlerini başlatamaz. Daha fazla bilgi için ön plan hizmetleri belgelerine bakın.

Ön plan hizmeti oluşturmanın iki yöntemi vardır. Kendi Service hizmetinizi beyan edebilir ve Service.startForeground() yöntemini çağırarak hizmetin ön plan hizmeti olduğunu belirtebilirsiniz. Alternatif olarak, uzun çalışan çalışanlar için destek bölümünde açıklandığı gibi, WorkManager'ı ön plan hizmeti oluşturmak için kullanabilirsiniz. Ancak WorkManager tarafından oluşturulan bir ön plan hizmetinin, diğer tüm ön plan hizmetleriyle aynı kısıtlamalara uyması gerektiğini unutmayın. WorkManager, ön plan hizmeti oluşturmayı kolaylaştıran bazı pratik API'ler sunar.

Alternatif API'ler

Sistem, daha özel kullanım alanlarında daha iyi performans göstermek üzere tasarlanmış alternatif API'ler sunar. Kullanım alanınız için alternatif bir API varsa uygulamanızın daha iyi performans göstermesine yardımcı olacağı için ön plan hizmeti yerine bu API'yi kullanmanızı öneririz. Ön plan hizmet türleri belgeleri, belirli bir ön plan hizmet türü yerine kullanılabilecek iyi bir alternatif API olduğu durumları belirtir.

Alternatif API'lerin kullanımıyla ilgili en yaygın senaryolardan bazıları şunlardır:

Kullanıcı tarafından başlatılan görevler

Uygun API'nin nasıl seçileceğini gösteren akış şeması. Bu grafikte, "Kullanıcı tarafından başlatılan görevler" bölümündeki materyal özetlenmektedir.
Şekil 1: Kullanıcı tarafından başlatılan arka plan görevini çalıştırmak için doğru API'nin nasıl seçileceği.

Bir uygulamanın arka plan görevlerini gerçekleştirmesi gerekiyorsa ve işlem, uygulama görünür durumdayken kullanıcı tarafından başlatılıyorsa doğru yaklaşımı bulmak için bu soruları yanıtlayın.

Uygulama arka plandayken görevin çalışmaya devam etmesi gerekir mi?

Uygulama arka plandayken görevin çalışmaya devam etmesi gerekmiyorsa eşzamansız çalışma özelliğini kullanmanız gerekir. Eşzamansız çalışma yapmak için birçok seçenek vardır. Burada anlaşılması gereken önemli nokta, uygulama arka plana geçerse bu seçeneklerin tümünün çalışmayacağıdır. (Uygulama kapatıldığında da durur.) Örneğin, bir sosyal medya uygulaması içerik feed'ini yenilemek isteyebilir, ancak kullanıcı ekrandan ayrılırsa işlemi tamamlaması gerekmez.

Görev ertelenir veya kesilirse kötü bir kullanıcı deneyimi olur mu?

Bir görevin ertelenmesi veya iptal edilmesi durumunda kullanıcı deneyiminin zarar görüp görmeyeceğini göz önünde bulundurmak önemlidir. Örneğin, bir uygulamanın öğelerini güncellemesi gerekiyorsa kullanıcı, işlemin hemen mi yoksa gece yarısı cihaz şarj olurken mi gerçekleştiğini fark etmeyebilir. Bu gibi durumlarda, arka planda çalışma seçeneklerini kullanmanız gerekir.

Görev kısa ve kritik bir görev mi?

Görev gecikmiyorsa ve hızlı bir şekilde tamamlanırsa shortService türünde bir ön plan hizmeti kullanabilirsiniz. Bu hizmetleri oluşturmak diğer ön plan hizmetlerine göre daha kolaydır ve çok fazla izin gerektirmez. Ancak, kısa hizmetlerin tamamlanması üç dakika içinde tamamlanır.

Sadece bu amaca yönelik alternatif bir API var mı?

Görev, kullanıcı tarafından görülemiyorsa doğru çözüm bir ön plan hizmeti kullanmak olabilir. Bu hizmetler başladıktan sonra sürekli olarak çalışır. Bu nedenle, görevi kesintiye uğratmanın kötü bir kullanıcı deneyimine neden olacağı durumlarda iyi bir seçimdir. Örneğin, bir antrenman izleme uygulaması, kullanıcıların koşu rotalarını harita üzerinde kaydedebilmesini sağlamak için konum sensörlerini kullanabilir. Arka planda çalışma seçeneğiyle bunu yapmak istemezsiniz çünkü görev duraklatılırsa izleme hemen duracaktır. Böyle bir durumda, ön plan hizmeti kullanmak çok mantıklıdır.

Ancak ön plan hizmetleri potansiyel olarak çok sayıda cihaz kaynağı kullanabileceğinden sistem, bunların ne zaman ve nasıl kullanılabileceğine dair birçok kısıtlama uygular. Çoğu durumda ön plan hizmeti yerine, işi sizin yerinize daha az sorunsuz yapan alternatif bir API kullanabilirsiniz. Örneğin, kullanıcı belirli bir konuma vardığında uygulamanızın bir işlem yapması gerekiyorsa en iyi seçeneğiniz, kullanıcının konumunu bir ön plan hizmetiyle izlemek yerine coğrafi bölge belirleme API'sini kullanmaktır.

Bir etkinliğe yanıt olarak belirlenen görevler

Uygun API'nin nasıl seçileceğini gösteren akış şeması. Bu grafikte, "Bir etkinliğe verilen görevler" bölümündeki materyal özetlenmektedir.
Şekil 2: Etkinlik tarafından tetiklenen bir arka plan görevi çalıştırmak için doğru API'yi seçme.

Bazen bir uygulamanın bir tetikleyiciye tepki olarak arka planda çalışması gerekir. Örneğin:

Bu, harici bir tetikleyici (FCM mesajı gibi) veya uygulamanın kendisi tarafından ayarlanan bir alarmdan kaynaklanıyor olabilir. Örneğin, bir oyun bazı öğeleri güncellemesini isteyen bir FCM mesajı alabilir.

Görevin birkaç saniye içinde tamamlanacağından emin olursanız görevi gerçekleştirmek için eşzamansız çalışmayı kullanın. Sistem, arka planda olsa bile uygulamanızın bu tür görevleri gerçekleştirmesi için birkaç saniye süre tanır.

Görev birkaç saniyeden uzun sürerse görevi gerçekleştirmek için bir ön plan hizmeti başlatmak uygun olabilir. Aslında, uygulamanız şu anda arka planda çalışıyor olsa bile, görev kullanıcı tarafından tetiklendiyse ve arka planda başlatma kısıtlamalarından onaylanmış muafiyet kapsamına giriyorsa bir ön plan hizmeti başlatmasına izin verilebilir. Örneğin, bir uygulama yüksek öncelikli FCM mesajı alırsa arka planda olsa bile uygulamanın ön plan hizmeti başlatmasına izin verilir.

Görev birkaç saniyeden uzun sürerse görev planlama API'lerini kullanın.