การเปรียบเทียบระดับบริการพื้นฐานระดับท้องถิ่นระหว่างดำเนินการกับAsyncTask: กับ
answer (คำตอบนี้ไม่ได้กล่าวถึงบริการที่ส่งออกหรือบริการใด ๆ ที่ดำเนินการในกระบวนการที่แตกต่างจากของลูกค้าเนื่องจากกรณีการใช้งานที่คาดหวังจะแตกต่างอย่างมากจากของAsyncTaskลูกค้านอกจากนี้เพื่อประโยชน์ของความกระชับServicesubclasses (เช่นIntentService, JobService) จะถูกละเว้นที่นี่.)
อายุการใช้งานกระบวนการ
A Serviceหมายถึงระบบปฏิบัติการ "ความต้องการของแอปพลิเคชันในการดำเนินการที่ยาวนานขึ้นโดยไม่ต้องโต้ตอบกับผู้ใช้" [ อ้างอิง ]
ในขณะที่คุณServiceใช้งาน Android เข้าใจดีว่าคุณไม่ต้องการให้กระบวนการของคุณถูกฆ่า นี้ยังเป็นจริงเมื่อใดก็ตามที่คุณมีActivityบนหน้าจอและมันเป็นความจริงโดยเฉพาะอย่างยิ่งเมื่อคุณกำลังเรียกใช้บริการเบื้องหน้า (เมื่อส่วนประกอบแอปพลิเคชันของคุณหายไป Android คิดว่า "โอ้ตอนนี้เป็นเวลาที่ดีที่จะฆ่าแอพนี้เพื่อให้ฉันสามารถเพิ่มทรัพยากรได้")
นอกจากนี้ขึ้นอยู่กับมูลค่าส่งคืนล่าสุดจากService.onCreate()Android สามารถพยายามที่จะ "ฟื้น" แอพ / บริการที่ถูกฆ่าเนื่องจากความกดดันของทรัพยากร [ อ้างอิง ]
AsyncTasksอย่าทำอย่างนั้น ไม่ว่าคุณจะใช้งานเธรดพื้นหลังจำนวนเท่าใดหรือทำงานหนักแค่ไหน: Android จะไม่ทำให้แอปของคุณมีชีวิตอยู่เพียงเพราะแอปของคุณใช้ซีพียู มันต้องมีวิธีการบางอย่างที่รู้ว่าแอปของคุณยังคงมีงานต้องทำ นั่นคือเหตุผลServicesที่ลงทะเบียนกับระบบปฏิบัติการและAsyncTasksไม่ใช่
multithreading
AsyncTasks ทั้งหมดเกี่ยวกับการสร้างเธรดพื้นหลังที่จะทำงานแล้วนำเสนอผลลัพธ์ของการทำงานนั้นไปยังเธรด UI ในรูปแบบ threadsafe
AsyncTaskการดำเนินการใหม่แต่ละครั้งโดยทั่วไปจะส่งผลให้เกิดการทำงานพร้อมกันมากขึ้น (เธรดมากขึ้น) ขึ้นอยู่กับข้อ จำกัด ของAsyncTasks'sเธรดพูล [ อ้างอิง ]
Serviceในทางกลับกันจะเรียกใช้วิธีการในเธรด UI [ อ้างอิง ] เสมอ นี้นำไปใช้onCreate(), onStartCommand(), onDestroy(), onServiceConnected()ฯลฯ ดังนั้นในความรู้สึกบางอย่างที่Servicesทำไม่ได้ "รัน" ในพื้นหลัง เมื่อพวกเขาเริ่ม ( onCreate()) พวกเขาเพียงแค่ "นั่ง" ที่นั่น - จนกว่าจะถึงเวลาที่จะทำความสะอาดดำเนินการonStartCommand()ฯลฯ
กล่าวอีกนัยหนึ่งการเพิ่มเพิ่มเติมServicesไม่ได้ทำให้เกิดการทำงานพร้อมกันมากขึ้น วิธีการบริการไม่ได้เป็นสถานที่ที่ดีที่จะทำจำนวนมากของการทำงานเพราะพวกเขาทำงานในหัวข้อ UI
แน่นอนคุณสามารถขยายServiceเพิ่มวิธีการของคุณเองและเรียกพวกเขาจากหัวข้อใด ๆ ที่คุณต้องการ แต่ถ้าคุณทำเช่นนั้นความรับผิดชอบต่อความปลอดภัยของเธรดอยู่กับคุณ - ไม่ใช่กรอบ
หากคุณต้องการเพิ่มเธรดพื้นหลัง (หรือประเภทอื่น ๆ ของผู้ปฏิบัติงาน) ให้กับคุณServiceคุณมีอิสระที่จะทำเช่นนั้น คุณสามารถเริ่มด้าย / พื้นหลังAsyncTaskในService.onCreate()ตัวอย่างเช่น แต่ไม่ใช่ทุกกรณีที่จำเป็นต้องใช้สิ่งนี้ ตัวอย่างเช่น:
- คุณอาจต้องการที่จะ
Serviceทำงานต่อไปเพื่อให้คุณสามารถรับการอัปเดตตำแหน่งใน "พื้นหลัง" (ความหมายโดยไม่จำเป็นต้องมีActivitiesบนหน้าจอ)
- หรือคุณอาจต้องการให้แอปของคุณยังมีชีวิตอยู่เพื่อให้คุณสามารถ
BroadcastReceiverลงทะเบียน"โดยนัย" ในระยะยาว (หลังจาก API 26 คุณไม่สามารถทำสิ่งนี้ได้ผ่านรายการดังนั้นคุณต้องลงทะเบียนที่รันไทม์แทน [ อ้างอิง ])
กรณีการใช้งานเหล่านี้ไม่จำเป็นต้องใช้กิจกรรม CPU อย่างมาก พวกเขาเพียงแค่ต้องการให้แอปไม่ถูกฆ่า
ในฐานะคนงาน
Servicesไม่ได้มุ่งเน้นงาน พวกเขาจะไม่ได้ตั้งค่าที่ "ดำเนินการงาน" และ "ส่งผลให้" เหมือนAsyncTasksเป็น Servicesไม่แก้ปัญหาความปลอดภัยของเธรดใด ๆ (แม้จะมีความจริงที่ว่าวิธีการทั้งหมดดำเนินการในหัวข้อเดียว) AsyncTasksในทางกลับกันจัดการกับความซับซ้อนนั้นสำหรับคุณ
ทราบว่าAsyncTaskมีการกำหนดไว้สำหรับการเลิกใช้ แต่นั่นไม่ได้หมายความว่าคุณควรแทนที่AsyncTasksด้วยServices! (หากคุณได้เรียนรู้อะไรจากคำตอบนี้จะต้องชัดเจนมาก)
TL; DR
Servicesส่วนใหญ่จะมี "มีอยู่" พวกเขาเป็นเหมือนหน้าจอปิดActivityให้เหตุผลสำหรับแอปมีชีวิตอยู่ในขณะที่ส่วนประกอบอื่น ๆ ดูแล "ทำงาน" AsyncTasksทำงาน "" แต่พวกเขาจะไม่ทำให้กระบวนการมีชีวิต