บริการเทียบกับ IntentService ในแพลตฟอร์ม Android


774

ฉันกำลังค้นหาตัวอย่างของสิ่งที่สามารถทำได้ด้วยสิ่งIntentServiceที่ไม่สามารถทำได้ด้วยService(และในทางกลับกัน)

ฉันยังเชื่อว่าการIntentServiceวิ่งในเธรดอื่นและ a Serviceไม่ IntentServiceดังนั้นเท่าที่ผมสามารถมองเห็นเริ่มบริการภายในด้ายของตัวเองเป็นเหมือนการเริ่มต้น ถูกต้องไหม


45
IntentService is used for short tasks (etc) and a service is for long onesคุณอ่านมาจากที่ไหน
njzk2

9
นอกจากนี้ฉันขอแนะนำให้คุณอ่านซอร์สโค้ดสำหรับ IntentService มันทำให้ชัดเจนว่ามันคืออะไรและมันทำอะไร
njzk2

1
ฉันแก้ไขคำถามหลังจากเห็นความคิดเห็นของคุณ
roiberg

9
รหัสสำหรับ IntentService: android.googlesource.com/platform/frameworks/base/+/refs/heads/…
greg7gkb

2
ลิงก์ในความคิดเห็นก่อนหน้า (โดย greg7gkb) เป็นการอ่านที่ยอดเยี่ยม
DSlomer64

คำตอบ:


1348

Tejas Lagvankar เขียนโพสต์ที่ดีเกี่ยวกับเรื่องนี้ ด้านล่างนี้เป็นข้อแตกต่างที่สำคัญระหว่างบริการและ IntentService

ควรใช้เมื่อใด

  • บริการสามารถใช้ในงานที่มีไม่มี UI แต่ไม่ควรยาวเกินไป หากคุณต้องการทำงานที่ยาวนานคุณต้องใช้เธรดภายในบริการ

  • IntentServiceสามารถนำมาใช้ในการทำงานนานมักจะมีการสื่อสารเพื่อหัวข้อหลักไม่มี หากต้องการการสื่อสารสามารถใช้ตัวจัดการเธรดหลักหรือ intents บรอดคาสต์ อีกกรณีหนึ่งของการใช้งานคือเมื่อจำเป็นต้องใช้การเรียกกลับ (งานที่ตั้งใจทำ)

วิธีการกระตุ้น?

  • บริการstartService()ถูกเรียกโดยวิธีการโทร

  • IntentServiceจะถูกเรียกใช้เจตจำนงมัน spawns ด้ายคนงานใหม่และวิธีการที่onHandleIntent()เรียกว่าในหัวข้อนี้

ถูกกระตุ้นจาก

  • บริการและIntentServiceอาจถูกเรียกจากด้ายกิจกรรมหรือส่วนประกอบโปรแกรมอื่น ๆ

วิ่งบน

  • บริการทำงานในพื้นหลัง แต่มันทำงานบนหัวข้อหลักของการประยุกต์ใช้

  • IntentServiceทำงานบนด้ายคนแยกเป็นสัดส่วน

ข้อ จำกัด / ข้อเสีย

  • บริการอาจปิดกั้นหัวข้อหลักของการประยุกต์ใช้

  • IntentServiceไม่สามารถเรียกใช้งานในแบบคู่ขนาน ดังนั้นความตั้งใจต่อเนื่องทั้งหมดจะเข้าสู่คิวข้อความสำหรับเธรดผู้ปฏิบัติงานและจะดำเนินการตามลำดับ

หยุดเมื่อไหร่?

  • หากคุณใช้บริการมันเป็นความรับผิดชอบของคุณเพื่อหยุดให้บริการเมื่อการทำงานของมันจะทำโดยการเรียกหรือstopSelf() stopService()(หากคุณต้องการให้การเชื่อมคุณไม่จำเป็นต้องใช้วิธีนี้)

  • IntentServicestopSelf()หยุดให้บริการหลังการร้องขอการเริ่มต้นทั้งหมดได้รับการจัดการเพื่อให้คุณไม่ต้องโทร


11
สั้นและหวาน แต่จะดีกว่าถ้าคุณแก้ไขคำตอบของคุณรวมถึงคะแนนโดย CommonsWare เนื่องจากผู้คนจำนวนมากอ่านเฉพาะคำตอบที่ได้รับการยอมรับหรือมีผู้โหวตมากที่สุด
Shirish Herwade

12
@Darpan A Service เป็นองค์ประกอบของแอปพลิเคชั่นที่สามารถทำงานได้ยาวนานในพื้นหลังและไม่ได้ให้ส่วนต่อประสานกับผู้ใช้ บริการทำงานในเธรดหลักของกระบวนการโฮสต์ บริการไม่ได้สร้างเธรดของตนเองและไม่ได้ทำงานในกระบวนการแยกต่างหาก (เว้นแต่คุณจะระบุเป็นอย่างอื่น) ซึ่งหมายความว่าหากบริการของคุณกำลังทำงาน CPU มากหรือการดำเนินการบล็อก (เช่นการเล่น MP3 หรือเครือข่าย) คุณควรสร้างเธรดใหม่ภายในบริการเพื่อให้สามารถทำงานได้
José Juan Sánchez

8
"IntentService ต้องถูกทริกเกอร์จากเธรดหลัก" คุณแน่ใจไหม? ภายใน MainActivity onCreate () ของฉันเมื่อฉันเรียก IntentService จากเธรดใหม่ (รหัสด้านล่าง) มันยังใช้ได้สำหรับฉัน กระทู้ใหม่ (Runnable ใหม่ () {@Override โมฆะสาธารณะเรียกใช้ () {เจตนาเจตนา = เจตนาใหม่ (บริบท HelloIntentService.class); startService (เจตนา);}}). start ();
Ashok Bijoy Debnath

9
@AshokBijoyDebnath คุณพูดถูก! บริการและIntentServicesสามารถเริ่มต้นจากด้ายกิจกรรมหรือส่วนประกอบโปรแกรมอื่น ๆ ฉันเพิ่งแก้ไขข้อความของคำตอบเพื่อแก้ไขปัญหานี้ ขอบคุณสำหรับคำแนะนำการแก้ไขของคุณ! :)
José Juan Sánchez

2
ไม่มีปัญหาไปเลย!
José Juan Sánchez

165

หากมีคนสามารถแสดงตัวอย่างของสิ่งที่สามารถทำได้ด้วยIntentServiceและไม่สามารถทำได้ด้วยServiceและวิธีอื่น ๆ

โดยความหมายที่เป็นไปไม่ได้ IntentServiceเป็นคลาสย่อยของที่Serviceเขียนใน Java ดังนั้นสิ่งใดที่IntentServicea Serviceสามารถทำได้โดยการรวมบิตที่เกี่ยวข้องของรหัสที่IntentServiceใช้

การเริ่มต้นเซอร์วิสด้วยเธรดของตัวเองเปรียบเสมือนการเริ่มต้น IntentService ไม่ใช่เหรอ

สามคุณสมบัติหลักของการIntentServiceคือ:

  • ด้ายพื้นหลัง

  • การจัดคิวอัตโนมัติของIntents ที่ส่งไปยังonStartCommand()ดังนั้นหากIntentมีการประมวลผลโดยonHandleIntent()บนเธรดพื้นหลังคำสั่งอื่น ๆ จะรอคิวถึงคิว

  • การปิดเครื่องอัตโนมัติของสายIntentServiceผ่านไปยังstopSelf()เมื่อคิวว่างเปล่า

ใด ๆ และทั้งหมดที่อาจจะมีการดำเนินการโดยโดยไม่ต้องขยายServiceIntentService


6
สายเล็ก ๆ น้อย ๆ แต่ฉันพบว่าServiceเรียกด้วยstartServiceสามารถทำงานได้ประมาณ 10 วินาทีก่อนที่จะโยน ANR - IntentServiceเริ่มต้นด้วยการออกอากาศเจตนาไม่ดูเหมือนจะมีข้อ จำกัด นี้
edthethird

16
@edthethird: นั่นเป็นเพราะคุณคาดหัวข้อแอพพลิเคชั่นหลัก เมธอดวงจรชีวิตทั้งหมดในส่วนประกอบทั้งหมดรวมถึงonStartCommand()a Serviceถูกเรียกบนเธรดแอปพลิเคชันหลัก คุณไม่สามารถผูกหัวข้อนี้มานานกว่าสองสามมิลลิวินาทีโดยไม่ต้องแช่แข็ง UI ของคุณและถ้าคุณใช้เวลาหลายวินาทีคุณจะได้รับบริการเทียบเท่า ANR
CommonsWare

3
yup ฉันแสดงความคิดเห็นเร็วเกินไป ฉันกำลังทำงานonStartCommandแทนonHandleIntent- ดูเหมือนว่าonStartCommandจะทำงานบนเธรด UI อย่างไรก็ตามเธรดแยกต่างหากจะเกิดจากonHandleIntentการดำเนินการ
edthethird

3
@IgorGanapolsky: IntentServiceเรียกมันว่าตัวเองหลังจากonHandleIntent()กลับมาหากไม่มีงานที่ต้องทำอีกต่อไป
คอมมอนส์

1
ปัญหาไม่ได้เป็นภาษาอังกฤษ แต่เป็นการเขียนโปรแกรม ตัวอย่างเช่น "ฉันปิดแอปแล้ว" ไม่มีคำจำกัดความที่แม่นยำดังนั้นฉันจึงไม่สามารถบอกคุณได้ว่าเกิดอะไรขึ้นเมื่อเกิดเหตุการณ์เช่นนี้ ฉันยังไม่ทราบว่า "ฉันได้ปิดแอพ" เกี่ยวข้องกับ "จะดาวน์โหลดหลังจาก 1 ชั่วโมง" คุณอาจลองถามคำถาม Stack Overflow แยกต่างหากซึ่งคุณสามารถให้ตัวอย่างที่ทำซ้ำได้น้อยที่สุดของ "จะดาวน์โหลดหลังจาก 1 ชั่วโมง" ที่นั่นคุณสามารถอธิบายรายละเอียดว่า "ฉันปิดแอพ" หมายความว่าอย่างไร (ตัวอย่างเช่นผู้ใช้ทำอะไรเพื่อปิดแอพโดยเฉพาะ)
CommonsWare

39

บริการ

  • เรียกใช้โดย startService()
  • เรียกจากที่ใด Thread
  • วิ่งบน Main Thread
  • อาจบล็อกเธรดหลัก (UI) ใช้เธรดภายในเซอร์วิสสำหรับงานที่ยาวนานเสมอ
  • เมื่องานเสร็จสิ้นแล้วมันเป็นความรับผิดชอบของเราที่จะหยุดให้บริการโดยการโทรstopSelf()หรือstopService()

IntentService

  • มันทำงานได้นานโดยปกติแล้วจะไม่มีการสื่อสารกับเธรดหลักหากต้องการการสื่อสารจากนั้นจะทำโดยHandlerหรือBroadcastReceiver
  • เรียกใช้ผ่าน Intent
  • ถูกกระตุ้นจาก Main Thread
  • ทำงานบนเธรดแยกต่างหาก
  • ไม่สามารถเรียกใช้งานในแบบคู่ขนานและหลาย intents ถูกจัดคิวในเธรดผู้ปฏิบัติงานเดียวกัน

19

อย่าประดิษฐ์ล้อใหม่

IntentServiceขยายระดับบริการซึ่งหมายถึงชัดเจนว่าIntentServiceมีเจตนาที่ทำเพื่อจุดประสงค์เดียวกัน

ดังนั้นจุดประสงค์คืออะไร?

`จุดประสงค์ของ IntentService คือการทำให้งานของเราง่ายขึ้นในการทำงานเบื้องหลังโดยไม่ต้องกังวล

  • การสร้างด้ายคนงาน

  • การจัดคิวการประมวลผลหลายคำขอหนึ่งโดยหนึ่ง ( Threading)

  • ทำลาย Service

ดังนั้นNO , Serviceสามารถทำงานใด ๆ ซึ่งIntentServiceจะทำ หากความต้องการของคุณอยู่ภายใต้เกณฑ์ที่กล่าวถึงข้างต้นคุณไม่จำเป็นต้องเขียน logics เหล่านั้นในServiceชั้นเรียน ดังนั้นอย่าประดิษฐ์ล้อใหม่เพราะIntentServiceเป็นล้อที่ประดิษฐ์ขึ้นมา

ความแตกต่าง "หลัก"

บริการทำงานบนเธรด UI ในขณะที่ IntentService ทำงานบนเธรดแยกต่างหาก

คุณใช้ IntentService เมื่อใด

เมื่อคุณต้องการที่จะทำงานพื้นหลังหลายอย่างทีละอันที่มีอยู่นอกเหนือขอบเขตของกิจกรรมนั้นIntentServiceสมบูรณ์แบบ

IntentServiceเป็นอย่างไรมาจากไหนService

มีบริการวิ่งปกติในหัวข้อ UI (ใด ๆ Android ตัวแทนประเภทวิ่งในหัวข้อ UI โดยเช่นเริ่มต้นActivity, BroadcastReceiver, ContentProviderและService) หากคุณต้องทำงานบางอย่างที่อาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์คุณต้องสร้างเธรด synchronizationในกรณีของการร้องขอหลายที่คุณจะต้องจัดการกับ IntentServiceจะได้รับการใช้งานเริ่มต้นซึ่งจะทำงานเหล่านั้นให้คุณ
ตามหน้านักพัฒนา

  1. IntentService สร้างเธรดผู้ปฏิบัติงาน

  2. IntentServiceสร้าง Work Workue ที่ส่งการร้องขอไปยังonHandleIntent()วิธีหนึ่งโดยหนึ่ง

  3. เมื่อไม่มีงานจึงIntentServiceเรียกstopSelf()วิธีการ
  4. ให้การใช้งานเริ่มต้นสำหรับonBind()วิธีการที่เป็นโมฆะ
  5. การใช้งานเริ่มต้นonStartCommand()ซึ่งส่งIntentคำขอไปยัง WorkQueue และในที่สุดก็ถึงonHandleIntent()

15

การเพิ่มคะแนนให้กับคำตอบที่ยอมรับ:

ดูการใช้ IntentService ภายใน Android API เช่น:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

ในการสร้างองค์ประกอบ IntentService สำหรับแอปของคุณให้กำหนดคลาสที่ขยาย IntentService และภายในกำหนดวิธีที่จะแทนที่ onHandleIntent ()

นอกจากนี้โปรดดูซอร์สโค้ดของ IntentService ซึ่งเป็นตัวสร้างและวิธีวงจรชีวิตเช่น onStartCommand ...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

บริการร่วมกัน AsyncTask เป็นหนึ่งในวิธีการที่ดีที่สุดสำหรับกรณีการใช้งานจำนวนมากที่มีน้ำหนักบรรทุกไม่มาก หรือเพียงแค่สร้างคลาสที่ขยาย IntentSerivce จาก Android เวอร์ชั่น 4.0 การดำเนินการเครือข่ายทั้งหมดควรอยู่ในกระบวนการพื้นหลังไม่เช่นนั้นแอปพลิเคชันคอมไพล์ / บิลด์ล้มเหลว แยกเธรดจาก UI คลาส AsyncTask จัดเตรียมหนึ่งในวิธีที่ง่ายที่สุดในการเริ่มงานใหม่จากเธรด UI สำหรับการอภิปรายเพิ่มเติมของหัวข้อนี้ดูโพสต์บล็อก

จากคู่มือนักพัฒนา Android :

IntentService เป็นคลาสพื้นฐานสำหรับบริการที่จัดการคำขอแบบอะซิงโครนัส (แสดงเป็น Intents) ตามต้องการ ลูกค้าส่งคำร้องขอผ่านการเรียก startService (Intent) บริการเริ่มต้นตามต้องการจัดการแต่ละเจตนาในทางกลับกันโดยใช้เธรดผู้ปฏิบัติงานและหยุดตัวเองเมื่อหมดงาน

รูปแบบการออกแบบที่ใช้ใน IntentService

: แพทเทิร์น "ตัวประมวลผลคิวงาน" นี้มักใช้เพื่อถ่ายโอนงานจากเธรดหลักของแอปพลิเคชัน คลาส IntentService มีอยู่เพื่อทำให้รูปแบบนี้ง่ายขึ้นและดูแลกลไก หากต้องการใช้ให้ขยาย IntentService และใช้ onHandleIntent (Intent) IntentService จะได้รับ Intents เปิดตัวเธรดผู้ปฏิบัติงานและหยุดบริการตามความเหมาะสม

คำขอทั้งหมดได้รับการจัดการในเธรดผู้ปฏิบัติงานเดียว - พวกเขาอาจใช้เวลานานเท่าที่จำเป็น (และจะไม่ปิดกั้นลูปหลักของแอปพลิเคชัน) แต่จะมีการประมวลผลคำขอเพียงครั้งเดียวในแต่ละครั้ง

คลาส IntentService จัดเตรียมโครงสร้างที่ไม่ซับซ้อนสำหรับการรันการดำเนินการบนเธรดพื้นหลังเดี่ยว สิ่งนี้ทำให้สามารถจัดการกับการดำเนินงานที่ยาวนานโดยไม่กระทบต่อการตอบสนองของส่วนต่อประสานผู้ใช้ของคุณ นอกจากนี้ IntentService ยังไม่ได้รับผลกระทบจากเหตุการณ์วงจรชีวิตส่วนติดต่อผู้ใช้ส่วนใหญ่ดังนั้นจึงยังคงทำงานในสถานการณ์ที่จะปิด AsyncTask

IntentService มีข้อ จำกัด เล็กน้อย:

ไม่สามารถโต้ตอบโดยตรงกับส่วนต่อประสานผู้ใช้ของคุณ ในการใส่ผลลัพธ์ใน UI คุณต้องส่งพวกเขาไปยังกิจกรรม คำของานทำงานตามลำดับ หากการดำเนินการกำลังทำงานใน IntentService และคุณส่งการร้องขออื่นคำขอนั้นจะรอจนกว่าการดำเนินการครั้งแรกจะเสร็จสิ้น การดำเนินการที่ทำงานบน IntentService ไม่สามารถถูกขัดจังหวะได้ อย่างไรก็ตามในกรณีส่วนใหญ่

IntentService เป็นวิธีที่ต้องการในการดำเนินการพื้นหลังอย่างง่าย

**

ห้องสมุดวอลเล่ย์

มีห้องสมุดชื่อvolley-library สำหรับการพัฒนาแอปพลิเคชั่นเครือข่าย android ซอร์สโค้ดนั้นมีให้สำหรับสาธารณะใน GitHub

เอกสารประกอบอย่างเป็นทางการของ android สำหรับ แนวทางปฏิบัติที่ดีที่สุดสำหรับงานแบ็คกราวด์ : ช่วยให้เข้าใจบริการเจตนา, เธรด, ตัวจัดการ, บริการได้ดียิ่งขึ้น และการดำเนินการเครือข่าย


1
มันอาจจะดีกว่าถ้าคุณตอบสั้น ๆ ได้
eRaisedToX

12

ฉันแน่ใจว่าคุณสามารถค้นหารายการความแตกต่างมากมายโดยเพียงแค่ค้นหาสิ่งต่าง ๆ เช่น 'Android IntentService vs Service'

หนึ่งในความแตกต่างที่สำคัญต่อตัวอย่างคือ IntentService สิ้นสุดลงเมื่อดำเนินการเสร็จ

ตัวอย่างบางส่วน (ทำขึ้นอย่างรวดเร็ว) อาจเป็น;

IntentService: หากคุณต้องการดาวน์โหลดรูปภาพจำนวนมากเมื่อเริ่มเปิดแอพของคุณ เป็นกระบวนการที่ใช้ครั้งเดียวและสามารถล้างตัวเองเมื่อทุกอย่างถูกดาวน์โหลด

บริการ: บริการที่จะใช้ในการสื่อสารระหว่างแอปของคุณและแบ็คเอนด์ด้วยการโทรผ่านเว็บ API อย่างต่อเนื่อง แม้ว่ามันจะเสร็จสิ้นภารกิจปัจจุบันแล้ว แต่คุณก็ยังต้องการให้มันใช้เวลาอีกไม่กี่นาทีเพื่อการสื่อสารที่มากขึ้น


2
ฉันไม่พบตัวอย่างหนึ่งที่สามารถทำได้ด้วยหนึ่งและไม่ได้อยู่กับอีกตัวอย่าง แค่คำอธิบายบางอย่างที่ไม่ได้ช่วยฉัน
roiberg

1
ลองใช้ไซต์นี้มีคำอธิบายที่ดีมากมายเกี่ยวกับแนวคิดพื้นฐานของ Android พร้อมตัวอย่างที่ดีvogella.com/articles/AndroidServices/article.html
Stefan de Bruijn

4
เป็นอีกตัวอย่างหนึ่งของ "วิธีใช้" ไม่เฉพาะเมื่อใช้บริการและเมื่อบริการ intents โปรดให้ตัวอย่างเชิงทฤษฎีแก่ฉันและไม่เชื่อมโยงกับ "วิธีใช้" หรือสิ่งอื่นใดสำหรับตัวชี้วัดนั้น ฉันไม่ได้ขอให้คุณ "ทำงาน" สำหรับฉันในขณะที่ฉันไม่ได้ทำอะไรเลยที่ฉันได้เห็นสิ่งเหล่านั้นทั้งหมดแล้ว แต่ก็ไม่แน่ใจ
roiberg

5
นั่นคือความแตกต่างที่สำคัญ ตัวอย่างเช่นหากคุณใช้บริการเพื่อรักษาการเชื่อมต่อกับเซิร์ฟเวอร์อย่างต่อเนื่องคุณจะไม่สามารถใช้บริการ Intents ได้เนื่องจากบริการดังกล่าวถูกยกเลิกหลังจากที่ทำงานทั้งหมดเสร็จสิ้น
pelotasplus

24
เมื่อฉัน google มันนำฉันมาที่นี่ ตอนนี้ฉันอยู่ในวงวนไม่สิ้นสุด
Lou Morda

12

IntentService

IntentServiceรันบนเธรดของตัวเอง มันจะหยุดตัวเองเมื่อเสร็จสิ้น เหมือนไฟและลืม สายที่ตามมาจะถูกจัดคิว เหมาะสำหรับการโทรเข้าคิว นอกจากนี้คุณยังสามารถหมุนหลายหัวข้อภายในถ้าคุณจำเป็นต้องประคุณสามารถบรรลุนี้โดยใช้IntentService ThreadPoolExecutorฉันพูดแบบนี้เพราะหลายคนถามฉันว่า "ทำไมจึงใช้IntentServiceเพราะมันไม่รองรับการประมวลผลแบบขนาน" IntentServiceเป็นเพียงกระทู้ คุณสามารถทำสิ่งที่คุณต้องการภายใน - แม้กระทั่งการหมุนหลายเธรด ข้อแม้เดียวคือIntentServiceเสร็จสิ้นทันทีที่คุณหมุนหลายเธรดเหล่านั้น ไม่รอให้เธรดเหล่านั้นกลับมา คุณต้องดูแลสิ่งนี้ ดังนั้นฉันขอแนะนำให้ใช้ThreadPoolExecutorในสถานการณ์เหล่านั้น

  • ดีสำหรับการซิงค์อัปโหลด ฯลฯ ...

บริการ

โดยค่าเริ่มต้นServiceจะทำงานบนเธรดหลัก คุณต้องหมุนเธรดคนงานเพื่อทำงานของคุณ คุณต้องหยุดserviceอย่างชัดเจน ฉันใช้สถานการณ์เมื่อคุณต้องการเรียกใช้สิ่งต่าง ๆ ในพื้นหลังแม้ว่าคุณจะย้ายออกจากแอพของคุณและกลับมาเป็นหัวหน้าserviceมากขึ้น

  • อีกครั้งคุณสามารถเรียกใช้หลายเธรดถ้าคุณต้องการ
  • สามารถใช้สำหรับแอพเช่นเครื่องเล่นเพลง

คุณสามารถสื่อสารกลับไปที่กิจกรรมของคุณโดยใช้ BroadcastReceiversหากคุณต้องการ


8

IntentService เป็นส่วนเสริมของบริการที่ทำขึ้นเพื่อลดความยุ่งยากในการดำเนินงานที่ต้องดำเนินการในพื้นหลังและในเธรดแยกต่างหาก

IntentService เริ่มต้นสร้างเธรดและรันภารกิจในเธรด เมื่อทำเสร็จแล้วจะทำความสะอาดทุกอย่าง IntentService หนึ่งอินสแตนซ์เดียวเท่านั้นที่สามารถเรียกใช้ในเวลาเดียวกันมีการเรียกหลายสาย

มันใช้งานง่ายและสะดวกมากสำหรับการใช้งานจำนวนมากเช่นการดาวน์โหลดเนื้อหา แต่มีข้อ จำกัด ที่สามารถทำให้คุณต้องการใช้บริการขั้นพื้นฐาน (ไม่ใช่เรื่องง่าย) แทน

ตัวอย่างเช่นบริการที่เชื่อมต่อกับเซิร์ฟเวอร์ xmpp และเชื่อมโยงกับกิจกรรมไม่สามารถทำได้ง่ายๆโดยใช้ IntentService คุณจะเพิกเฉยหรือเพิกเฉยต่อข้อมูล IntentService


สิ่งที่ดูเหมือนว่าคนส่วนใหญ่ที่ต้องการใช้บริการระยะยาวที่แท้จริงในพื้นหลังท้ายที่สุดพยายามค้นหาเกี่ยวกับ IntentService เพราะเอกสารทำให้ดูเหมือนว่าเป็นการทำเช่นนั้น แต่คุณก็สามารถใช้เธรดใหม่ได้เช่นกัน (Runnable ใหม่ ()). start () กล่าวอีกนัยหนึ่งเมื่อมันพูดถึง "spawns เธรดใหม่" นั่นคือทั้งหมดที่มันทำมันไม่ย้ายไปยังกระบวนการที่แยกต่างหากซึ่งจริงๆแล้วสิ่งที่คนส่วนใหญ่มองหาทำเมื่อพวกเขาต้องการแยกรหัสที่วิ่งออกจากกิจกรรม ! (เพราะเพียงแค่วิ่งพล่านหัวข้อเป็นหนึ่งในสายการบินนะ)
Lassi Kinnunen

ความตั้งใจที่จะให้บริการดูแลวงจรชีวิตของด้ายและใช้ looper ซึ่งช่วยกำหนดตารางเวลา นอกจากนี้ยังทำให้แน่ใจว่ามีอินสแตนซ์เดียวเท่านั้นที่ทำงานและเข้าคิวการโทรอื่น ๆ
njzk2

5

หากมีคนสามารถแสดงตัวอย่างของสิ่งที่คุณสามารถทำได้ด้วยIntentServiceและไม่สามารถทำได้ด้วยserviceและวิธีอื่น ๆ

IntentService ไม่สามารถใช้สำหรับการฟังเป็นเวลานานได้เช่นเดียวกับ XMPP Listeners ซึ่งเป็นผู้ดำเนินการเวลาเดียวทำงานและโบกมือลา

นอกจากนี้ยังมีเพียงเธรดเดียว แต่ด้วยเคล็ดลับคุณสามารถใช้มันได้ไม่ จำกัด


4

ความแตกต่างหลักระหว่าง a Serviceและa IntentServiceถูกอธิบายดังนี้:

บริการ :

1.A Serviceโดยค่าเริ่มต้นทำงานบนเธรดหลักของแอปพลิเคชัน (ที่นี่ไม่มีเธรดผู้ปฏิบัติงานเริ่มต้น) ดังนั้นผู้ใช้จำเป็นต้องสร้างเธรดแยกต่างหากและทำงานที่จำเป็นในเธรดนั้น

2. อนุญาตหลายครั้งพร้อมกัน (Multi Threading)

บริการ IntentS:

1. ตอนนี้มาIntentServiceที่นี่เธรดผู้ปฏิบัติงานเริ่มต้นพร้อมที่จะดำเนินการใด ๆ โปรดทราบว่า - คุณต้องใช้onHandleIntent()วิธีการซึ่งได้รับความตั้งใจสำหรับคำขอเริ่มต้นแต่ละครั้งซึ่งคุณสามารถทำงานพื้นหลังได้

2. แต่อนุญาตได้ครั้งละหนึ่งคำขอเท่านั้น


3

บริการ IntentService ของ Android เทียบกับ

1. บริการ

  • มีการเรียกใช้บริการโดยใช้ startService ()
  • สามารถเรียกใช้บริการจากเธรดใดก็ได้
  • บริการเรียกใช้การดำเนินการพื้นหลังในเธรดหลักของแอปพลิเคชันโดยค่าเริ่มต้น ดังนั้นมันสามารถบล็อก UI แอปพลิเคชันของคุณ
  • บริการที่เรียกใช้หลายครั้งจะสร้างหลายอินสแตนซ์
  • บริการจะต้องหยุดใช้ stopSelf () หรือ stopService ()
  • บริการ Android สามารถดำเนินการแบบขนาน

2. IntentService

  • มีการเรียกใช้ IntentService โดยใช้ Intent
  • IntentService สามารถเรียกใช้จากเธรดหลักเท่านั้น
  • IntentService สร้างเธรดผู้ปฏิบัติงานแยกต่างหากเพื่อเรียกใช้การดำเนินการเบื้องหลัง
  • IntentService ที่เรียกใช้หลายครั้งจะไม่สร้างหลายอินสแตนซ์
  • IntentService จะหยุดโดยอัตโนมัติหลังจากคิวเสร็จสมบูรณ์ ไม่จำเป็นต้องเรียกใช้ stopService () หรือ stopSelf ()
  • ใน IntentService การโทรเจตนาหลายครั้งจะถูกจัดคิวโดยอัตโนมัติและจะถูกดำเนินการตามลำดับ
  • IntentService ไม่สามารถเรียกใช้การดำเนินการแบบขนานเช่นบริการ

อ้างอิงจากที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.