Uygulamaların aynı anda birden fazla işlem yapması sıklıkla gerekir. Android API'leri, bunu yapmanıza olanak tanıyan birçok farklı yol sunar. Doğru seçeneği belirlemek çok önemlidir. Bir seçenek bir durum için doğru olabilirken başka bir durum için çok yanlış olabilir. Yanlış API'leri seçmek, uygulamanızın performansını veya kaynak verimliliğini olumsuz etkileyebilir. Bu da pili tüketebilir ve kullanıcının cihazının performansını genel olarak düşürebilir. Bazı durumlarda yanlış yaklaşımı seçmek, uygulamanızın Play Store'da listelenmesini engelleyebilir.
Bu dokümanda, kullanabileceğiniz farklı seçenekler açıklanmakta ve durumunuza en uygun seçeneği belirlemenize yardımcı olunmaktadır.
Terminoloji
Arka plan görevleriyle ilgili bazı önemli terimler, birbiriyle çelişen birden fazla şekilde kullanılabilir. Bu nedenle, şartlarımızı tanımlamak önemlidir.
Arka planda çalışan uygulamalara sistem tarafından çeşitli kısıtlamalar uygulanır. (Örneğin, çoğu durumda arka plandaki bir uygulama ön plan hizmetlerini başlatamaz.)
Bu doküman kapsamında, bir uygulamanın ana iş akışı dışında gerçekleştirdiği işlemler için "görev" terimini kullanacağız. Anlayış birliği sağlamak için bu konuyu üç ana görev türü kategorisine ayırdık: eşzamansız çalışma, görev planlama API'leri ve ön plan hizmetleri.
Doğru seçeneği belirleyin
Çoğu senaryoda, görevinizin hangi kategoriye (asynchronize çalışma, görev planlama API'leri veya ön plan hizmetleri) ait olduğunu belirleyerek görev için kullanılacak doğru API'leri anlayabilirsiniz.
Hâlâ emin değilseniz karara daha fazla nüans katan akış şemalarını kullanabilirsiniz. Bu seçeneklerin her biri bu dokümanın ilerleyen bölümlerinde daha ayrıntılı olarak açıklanmıştır.
Arka plan görevleri için dikkate alınması gereken iki ana senaryo vardır:
- Uygulama görünür durumdayken kullanıcı tarafından başlatılan görev
- Görev, dahili veya harici bir etkinliğe yanıt olarak başlatılır
Bu iki senaryoda kendi karar ağaçlarınız vardır.
Eşzamansız çalışma
Birçok durumda, bir uygulamanın ön planda çalışırken eşzamanlı işlemler yapması yeterlidir. Örneğin, bir uygulamanın zaman alıcı bir hesaplama yapması gerekebilir. Hesaplama kullanıcı arayüzü iş parçacığında yapılırsa kullanıcı, hesaplama bitene kadar uygulamayla etkileşime geçemez. Bu durum ANR hatasına neden olabilir. Bu gibi durumlarda uygulama, asynchronize çalışma seçeneğini kullanmalıdır.
Sık kullanılan eşzamansız çalışma seçenekleri arasında Kotlin iş parçacıkları ve Java iş parçacıkları bulunur. Daha fazla bilgiyi eşzamansız çalışma dokümanlarında bulabilirsiniz. Arka plan görevi API'lerinin aksine, uygulama geçerli bir yaşam döngüsü aşamasında olmamaya başlarsa (ör. uygulama ön plandan çıkarsa) asenkron çalışmanın tamamlanmasının garanti edilmediğini unutmayın.
Görev planlama API'leri
Kullanıcı uygulamadan ayrılsa bile devam etmesi gereken görevleri yapmanız gerektiğinde görev planlama API'leri daha esnek bir seçenektir. Çoğu durumda, arka planda görev çalıştırmak için en iyi seçenek WorkManager'ı kullanmaktır. Ancak bazı durumlarda platform JobScheduler
API'sini kullanmak uygun olabilir.
WorkManager, basit veya karmaşık işleri ihtiyacınız doğrultusunda ayarlamanıza olanak tanıyan güçlü bir kitaplıktır. Görevleri belirli zamanlarda çalışacak şekilde planlamak veya görevin çalışacağı koşulları belirtmek için WorkManager'ı kullanabilirsiniz. Hatta her görev sırayla çalıştırılarak sonuçlarını bir sonrakine iletecek görev zincirleri oluşturabilirsiniz. Kullanılabilen tüm seçenekleri anlamak için WorkManager özellik listesini inceleyin.
Arka plan görevleri için en yaygın senaryolardan bazıları şunlardır:
- Sunucudan periyodik olarak veri getirme
- Sensör verileri (ör. adım sayacı verileri) getirme
- Periyodik konum verileri 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çerik tetikleyicisine göre içerik yükleme
Ön plan hizmetleri
Ön plan hizmetleri, kesintiye uğramaması gereken görevleri hemen çalıştırmanın güçlü bir yolunu sunar. Ancak ön plan hizmetleri cihaza ağır yük bindirebilir ve bazen gizlilik ve güvenlikle ilgili sonuçlar doğurabilir. Bu nedenle sistem, uygulamaların ön plan hizmetlerini nasıl ve ne zaman kullanabileceği konusunda birçok kısıtlamaya sahiptir. Örneğin, bir ön plan hizmetinin kullanıcı tarafından fark edilebilir olması gerekir ve çoğu durumda uygulamalar arka plandayken ö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
değerinizi beyan edebilir ve Service.startForeground()
çağrısını yaparak hizmetin ön plan hizmeti olduğunu belirtebilirsiniz. Alternatif olarak, uzun süre çalışan işleyiciler için destek bölümünde açıklandığı gibi, ön plan hizmeti oluşturmak için WorkManager'ı 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 bilmek önemlidir.
WorkManager, ön plan hizmeti oluşturmayı kolaylaştırmak için bazı kolaylık API'leri sağlar.
Alternatif API'ler
Sistem, daha spesifik kullanım alanlarında daha iyi performans göstermek için 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 dokümanında, belirli bir ön plan hizmet türü yerine kullanılabilecek iyi bir alternatif API olduğunda bu durum belirtilir.
Alternatif API'lerin kullanıldığı en yaygın senaryolardan bazıları şunlardır:
- Veri senkronizasyonu ön plan hizmeti oluşturmak yerine büyük indirme veya yükleme yapmak için kullanıcı tarafından başlatılan veri aktarımları kullanma
- Bağlı cihaz ön plan hizmetini kullanmak yerine Bluetooth eşleme ve veri aktarımı için yardımcı cihaz yöneticisini kullanma
- Medya oynatma ön plan hizmeti oluşturmak yerine video oynatmak için pencere içinde pencere modunu kullanma
Kullanıcı tarafından başlatılan görevler
Bir uygulamanın arka planda görev yapması 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.
Görevin, uygulama arka plandayken çalışmaya devam etmesi gerekiyor mu?
Uygulama arka plandayken görevin çalışmaya devam etmesine gerek yoksa asynchronize çalışma özelliğini kullanmanız gerekir. Eşzamansız çalışma için çeşitli seçenekler vardır. Uygulama arka plana geçerse bu seçeneklerin tümünün çalışmayı durdurduğunu unutmayın. (Uygulama kapatılırsa da durdurulur.) Ö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 ertelendiği veya kesintiye uğradığı takdirde kötü bir kullanıcı deneyimi yaşanır mı?
Bir görevin ertelenmesi veya iptal edilmesi durumunda kullanıcı deneyiminin zarar görüp görmeyeceği dikkate alınmalıdır. Örneğin, bir uygulamanın öğelerini güncellemesi gerekiyorsa kullanıcı, işlemin hemen mi yoksa cihaz şarj olurken gecenin ortasında mı gerçekleştiğini fark etmeyebilir. Bu gibi durumlarda arka plan çalışması seçeneklerini kullanmanız gerekir.
Görev kısa ve kritik mi?
Görev ertelenemeyecekse ve hızlı bir şekilde tamamlanacaksa shortService
türüne sahip bir ön plan hizmeti kullanabilirsiniz. Bu hizmetlerin oluşturulması diğer ön plan hizmetlerine kıyasla daha kolaydır ve bu hizmetler için çok fazla izin gerekmez. Ancak kısa hizmetler üç dakika içinde tamamlanmalıdır.
Yalnızca bu amaç için kullanılabilecek alternatif bir API var mı?
Görev kullanıcı tarafından görünmüyorsa doğru çözüm bir ön plan hizmeti kullanmak olabilir. Bu hizmetler, başlatıldıktan sonra sürekli olarak çalışır. Bu nedenle, görevin kesintiye uğratılması kötü bir kullanıcı deneyimine neden olacaksa bu hizmetler iyi bir seçimdir. Örneğin, egzersiz takibi yapan bir uygulama, kullanıcıların koşu rotalarını haritaya kaydetmelerine olanak tanımak için konum sensörlerini kullanabilir. Görev duraklatılırsa izleme hemen durur. Bu nedenle, arka planda çalışma seçeneğiyle bunu yapmak istemezsiniz. Bu gibi durumlarda ön plan hizmeti kullanmak en iyi seçenektir.
Ancak ön plan hizmetleri potansiyel olarak çok fazla cihaz kaynağı kullanabileceğinden sistem, bu hizmetlerin ne zaman ve nasıl kullanılabileceğine dair birçok kısıtlama getirir. Birçok durumda, ön plan hizmeti yerine işi sizin için daha az sorunla halledecek bir alternatif API kullanabilirsiniz. Örneğin, kullanıcı belirli bir konuma geldiğinde uygulamanızın işlem yapması gerekiyorsa en iyi seçeneğiniz, kullanıcının konumunu bir ön plan hizmetiyle izlemek yerine coğrafi çit API'sini kullanmaktır.
Bir etkinliğe yanıt olarak görevler
Bazen bir uygulamanın, tetikleyiciye yanıt olarak arka planda işlem yapması gerekir. Örneğin:
- Yayın mesajları
- Firebase Cloud Messaging (FCM) mesajları
- Uygulama tarafından ayarlanan alarmlar
Bu, harici bir tetikleyici (ör. FCM mesajı) veya uygulamanın kendisi tarafından ayarlanan bir alarma yanıt olabilir. Örneğin, bir oyuna bazı öğeleri güncellemesini söyleyen bir FCM mesajı gönderilebilir.
Görevin birkaç saniye içinde tamamlanacağından eminseniz görevi gerçekleştirmek için asynchronize çalışma kullanın. Sistem, uygulamanız arka planda olsa bile bu tür görevleri gerçekleştirmesi için uygulamanıza birkaç saniye süre tanır.
Görev birkaç saniyeden uzun sürecekse görevi yürütmek için bir ön plan hizmeti başlatmak uygun olabilir. Hatta uygulamanız şu anda arka planda olsa bile görev kullanıcı tarafından tetiklendiyse ve arka planda başlatma kısıtlamalarından muaf onaylı istisnalardan birine giriyorsa ön plan hizmeti başlatmasına izin verilebilir. Örneğin, bir uygulama yüksek öncelikli bir FCM mesajı alırsa uygulama arka planda olsa bile ön plan hizmeti başlatmasına izin verilir.
Görev birkaç saniyeden uzun sürecekse görev planlama API'lerini kullanın.