Görev planlama API'leri için pil kullanımını optimize etme

Bu sayfada, arka planda görevlerin düzgün çalışması için birkaç en iyi uygulama önerilmiştir. Bu en iyi uygulamalar özellikle pil tüketimini azaltmaya yöneliktir ancak ağ kullanımını azaltmak gibi başka yöntemlerle de cihaz performansını iyileştirebilir.

En uygun kısıtlamaları seçin ve görevleri birleştirin

Görevlerinizin cihaza yerleştirdiği yükü en aza indirmek için optimum kısıtlamaları belirlemeniz önemlidir. (JobScheduler işleriyle ilgili kısıtlamalar listesi için JobInfo.Builder sayfasına bakın.) Bir örnek verecek olursak, uygulamanızın pilinin bitmediğinden emin olmak istiyorsanız RequiresCharging kısıtlamasını belirtmeniz önerilir. Bu kısıtlama, pil seviyesi gerçekten artmadığı sürece sisteme işi çalıştırmamasını bildirir. Benzer şekilde, kablosuz bağlantı kullanmak genellikle mobil veriye kıyasla daha az güç gerektirir. Bu nedenle, göreviniz bir ağ bağlantısına ihtiyaç duyuyor ancak sınırsız bir ağ kullanılabilir olana kadar bekleyebiliyorsa bir NetworkType.UNMETERED kısıtlaması ayarlamak iyi bir fikirdir.

Ayrıca, aynı kısıtlamalara tabi birden fazla benzer göreviniz varsa bunları tek bir görevde birleştirmek genellikle iyi bir fikirdir. Böylece, cihaz yalnızca bir kez uyanır. Örneğin, uygulamanızın bulut depolama alanıyla senkronize etmesi gereken üç farklı veri kümesi olduğunu varsayalım. Her veri kümesi için bir tane olmak üzere üç farklı görev planlamak yerine, genellikle tek bir "verileri senkronize etme" görevi planlamak, uygun kısıtlamaları tanımlamak ve çalıştığında bekleyen tüm veri senkronizasyonunu bu görevin yapmasına izin vermek daha iyi bir fikirdir.

Bununla birlikte, alakasız görevleri tek bir her şeyi yapma görevi altında birleştirmeye çalışmamalısınız. Bunun yerine, her göreve uygun kısıtlamalar verdiğinizden emin olun. Örneğin, görevlerin önceliği düşükse cihaz boşta ve şarj olurken çalışacaklarını belirttiğinizden emin olun. Bu şekilde, cihaz birkaç kez uyanmış olsa bile kullanıcı deneyimini veya pil ömrünü etkilemez.

Yalnızca zaman açısından önemli olan görevleri hızlandırılmış olarak işaretleyin

Bir görev özellikle acilse onu hızlandırılmış olarak işaretleyebilirsiniz. (JobScheduler işleri için JobInfo.Builder.setExpedited(true)'i çağırın.) Bunu yaptığınızda göreve çeşitli şekillerde öncelik verilir. Örneğin, sistem mümkün olduğu anda bu görevleri yerine getirir ve güç yönetimi kısıtlamalarının hızlandırılmış görevleri etkileme olasılığı daha düşüktür.

Bu nedenlerle, ihtiyaç duyduğunuzda yalnızca bir görevi hızlandırılmış olarak işaretlemeye dikkat etmelisiniz. Hızlandırılmış görevler bazı sistem verimliliğini geçersiz kılabileceği için hızlandırılmış görevler bu şekilde işaretlenmemeleri halinde harcayacaklarına göre daha fazla güç tüketebilir.

Bir görevi yalnızca zaman açısından önemliyse hızlandırılmış olarak işaretlemelisiniz. Bu durumda görevin yürütülmesi daha uzun sürerse kullanıcı deneyimi olumsuz etkilenebilir. Örneğin, uygulamanız yüksek öncelikli FCM mesajını işlemek için bir görev çalıştırıyorsa bu, görevi hızlandırılmış olarak işaretlemek için uygun bir nedendir. Ancak sırf sistem optimizasyonlarını geçersiz kılmak için bir görevi hızlandırıldı olarak işaretlememelisiniz.

Görevlerinizin neden durdurulduğunu kontrol etme

Görevleriniz tamamlanmadan durursa WorkInfo.getStopReason() numarasını arayarak neden durdurulduğunu kontrol edebilirsiniz. (JobScheduler işleri için JobParameters.getStopReason() çağrısı yapın. Bu işlemin birkaç nedenden ötürü yapılması önemlidir. Her şeyden önce, elbette görevlerinizin bitmesini istiyorsunuz. Görevlerinizin neden durdurulduğunu öğrenmek benzer durumları önlemenize yardımcı olur. Ama aynı zamanda sistem kaynaklarını aşırı kullanan davranış nedeniyle büyük olasılıkla görevleri durduracaktır. Pili veya ağı gereksiz yere kullanan, uygulamanızın kötü bir kullanıcı olmasını istemezsiniz.

Örneğin, görevleriniz sıklıkla STOP_REASON_TIMEOUT nedeniyle durduruluyorsa görevlerinizin beklediğinizden çok daha uzun sürmesine neden olan sıra dışı bir durum olabilir.

Uygulamanızın görevlerinin durdurulup durdurulmadığını ve neden durdurulduğunu izlemek için analiz motorunuzu kullanmanızı öneririz.