Bir karşılaştırılması yerel, işlem içi, taban sınıf Servisi bir etmek ✱ AsyncTask:
✱ (Bu yanıt, dışa aktarılan hizmetleri veya istemcininkinden farklı bir süreçte çalışan herhangi bir hizmeti ele almaz, çünkü beklenen kullanım durumları birinkinden önemli ölçüde farklıdır AsyncTask. Servicealt sınıflar (ör. IntentService, JobService) burada yok sayılır.)
Süreç Ömrü
A Service, işletim sistemine "uygulamanın kullanıcıyla etkileşimde bulunmadan daha uzun süre çalışan bir işlem gerçekleştirme isteğini" temsil eder [ ref ].
Eğer bir sahipken Serviceçalışan, Android Eğer süreç öldürülmek istemiyoruz anlar. Bu, bir Activityekranınız olduğunda da geçerlidir ve özellikle bir ön plan hizmeti çalıştırdığınızda doğrudur . (Tüm uygulama bileşenleriniz kaybolduğunda, Android "Ah, şimdi bu uygulamayı öldürmek için iyi bir zaman, bu yüzden kaynakları serbest bırakabilirim" diye düşünüyor.)
Ayrıca, son dönüş değerine bağlı olarak Service.onCreate()Android, kaynak baskısı [ ref ] nedeniyle öldürülen uygulamaları / hizmetleri "canlandırmaya" çalışabilir .
AsyncTasksbunlardan hiçbirini yapma. Kaç tane arka plan iş parçacığı çalıştığınız veya ne kadar çok çalıştıkları önemli değildir: Android, uygulamanız CPU kullanıyor olduğundan uygulamanızı canlı tutmayacaktır. Uygulamanızın hala yapacak işleri olduğunu bilmenin bir yolu olmalı ; bu yüzden Servicesişletim sistemine kayıtlısınız ve kayıtlı AsyncTasksdeğilsiniz.
Çok iş parçacığı
AsyncTasks tamamen üzerinde çalışılacak bir arka plan iş parçacığı oluşturmak ve daha sonra bu çalışmanın sonucunu bir evre güvenli bir şekilde UI iş parçacığına sunmakla ilgilidir.
Her yeni AsyncTaskyürütme genellikle AsyncTasks'sthread-pool [ ref ] sınırlamalarına tabi olarak daha fazla eşzamanlılık (daha fazla thread) ile sonuçlanır .
ServiceÖte yandan, yöntemler her zaman UI iş parçacığında [ ref ] çağrılır . Şunun için geçerlidir onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), vb Yani, bir bakıma, Servicesarka planda değil "run" yok. Bir kez başladıktan sonra ( onCreate()), orada "oturmak" gibi - temizlenme, yürütme onStartCommand()vb.
Başka bir deyişle, ek eklemek Servicesdaha fazla eşzamanlılık ile sonuçlanmaz. Hizmet yöntemleri , UI iş parçacığında çalıştıkları için büyük miktarda iş yapmak için iyi bir yer değildir .
Tabii ki, genişletebilir Service, kendi yöntemlerinizi ekleyebilir ve bunları istediğiniz herhangi bir iş parçacığından çağırabilirsiniz. Ancak bunu yaparsanız, iplik güvenliği sorumluluğu size aittir - çerçeve değil.
Bir arka plan iş parçacığı (veya başka bir tür işçi) eklemek istiyorsanız Service, bunu yapmakta özgürsünüz. Örneğin bir arka plan iş parçacığı / AsyncTaskgirişi başlatabilirsiniz Service.onCreate(). Ancak tüm kullanım durumları bunu gerektirmez. Örneğin:
Service"Arka planda" konum güncellemelerini almaya devam edebilmeniz için çalışmaya devam etmek isteyebilirsiniz (yani, Activitiesekranda herhangi bir şeye sahip olmadan ).
- Ya da uygulamanızı canlı tutmak isteyebilirsiniz, böylece "örtük" bir dosyayı
BroadcastReceiveruzun vadede kayıtlı tutabilirsiniz (API 26'dan sonra bunu manifest üzerinden her zaman yapamazsınız, bunun yerine çalışma zamanında kayıt olmanız gerekir. [ ref ]).
Bu kullanım durumlarının hiçbiri çok fazla CPU etkinliği gerektirmez; sadece uygulamanın öldürülmemesini gerektirir .
İşçi Olarak
Servicesgörev odaklı değil. Bunlar, "bir görevi yerine getirmek" ve "bir sonuç sunmak" için ayarlanmamıştır AsyncTasks. Servicesherhangi bir iplik güvenliği sorununu çözmeyin (tüm yöntemlerin tek bir iş parçacığında yürütülmesine rağmen). AsyncTasksÖte yandan, bu karmaşıklığı sizin için halledin.
Not AsyncTaskolan kullanımdan kaldırılması planlanan . Ama bu sizin yerine AsyncTasksile değiştirmeniz gerektiği anlamına gelmez Services! (Eğer bu cevaptan bir şey öğrendiyseniz, çok şey açık olmalıdır.)
TL; DR
Servicesçoğunlukla "var olmak" için vardır. ActivityDiğer bileşenler "iş" yapmakla ilgilenirken, uygulamanın ekran dışı kalması için bir neden sağlayan bir ekran dışı gibidirler . AsyncTasks"iş" yaparlar, ancak kendi başlarına bir süreci canlı tutmazlar.