Android onCreate หรือ onStartCommand สำหรับการเริ่มบริการ


106

โดยปกติเมื่อฉันสร้างบริการ Android ฉันใช้onCreateวิธีนี้ แต่ในโครงการสุดท้ายของฉันไม่ได้ผล ฉันลองใช้onStartCommandแล้วและดูเหมือนว่าจะได้ผล

คำถามคือเมื่อต้องใช้บริการต้องใช้วิธีใด? ฉันต้องใช้วิธีใด onCreate, onStartCommandหรือทั้งสองอย่าง? และแต่ละบทบาทเป็นอย่างไร?


onCreateมักถูกเรียกโดยไม่คำนึงถึง
IgorGanapolsky

คำตอบ:


189

onCreate()จะถูกเรียกเมื่อServiceวัตถุ instantiated (เช่น: เมื่อบริการถูกสร้างขึ้น ) คุณควรทำสิ่งต่างๆในวิธีนี้ซึ่งคุณต้องทำเพียงครั้งเดียว (เช่นเริ่มต้นตัวแปรบางตัวเป็นต้น) onCreate()จะเท่านั้นที่เคยถูกเรียกว่าครั้งเดียวต่อวัตถุ instantiated

คุณจะต้องดำเนินการonCreate()ถ้าคุณต้องการ / ความจำเป็นในการเริ่มต้นสิ่งที่จริงเพียงครั้งเดียว

onStartCommand()เรียกว่าทุกครั้งที่startService(Intent intent)ลูกค้าเริ่มใช้บริการ ซึ่งหมายความว่าonStartCommand()สามารถเรียกได้หลายครั้ง คุณควรทำสิ่งต่างๆในวิธีนี้ที่จำเป็นทุกครั้งที่ลูกค้าร้องขอบางสิ่งจากบริการของคุณ สิ่งนี้ขึ้นอยู่กับสิ่งที่บริการของคุณทำและวิธีการสื่อสารกับลูกค้า (และในทางกลับกัน)

หากคุณไม่นำไปใช้onStartCommand()คุณจะไม่สามารถรับข้อมูลใด ๆ จากIntentที่ลูกค้าส่งผ่านไปให้onStartCommand()และบริการของคุณอาจไม่สามารถทำงานที่เป็นประโยชน์ได้


6
สองอินสแตนซ์ของบริการเดียวกันสามารถมีอยู่ในแอปพลิเคชันได้หรือไม่
jacktrades

1
@jacktrades ตามทฤษฎีและตามเอกสาร: ไม่อย่างไรก็ตามดูเหมือนว่าจะมีข้อผิดพลาดบางอย่างใน Android ซึ่งในบางสถานการณ์จะสร้างบริการหลายอินสแตนซ์ อย่างไรก็ตามอย่างที่ฉันพูดไปนี่เป็นข้อบกพร่องและเราไม่สามารถสร้างซ้ำได้อย่างน่าเชื่อถือตามต้องการ ทำไมคุณถึงถาม?
David Wasser

3
@Mr_and_Mrs_D ไม่มีรายงานข้อบกพร่องอย่างเป็นทางการเท่าที่ฉันรู้ อย่างไรก็ตามมีรายงานหลายอย่างเกี่ยวกับเหตุการณ์นี้และฉันมีแอปพลิเคชันที่ฉันรู้ว่ามันกำลังเกิดขึ้น ฉันไม่สามารถลดปัญหาให้เล็กลงและทำซ้ำได้ดังนั้นฉันจึงไม่ได้ยื่นข้อบกพร่องด้วยตัวเอง เอกสารประกอบไม่ได้ระบุอย่างชัดเจนว่าบริการเป็นแบบซิงเกิล แต่ชัดเจนมากว่านั่นคือสิ่งที่ตั้งใจไว้ ดูเอกสารสำหรับ 'startService () `: ระบุอย่างชัดเจนว่าหากบริการไม่ได้ทำงานอยู่จะมีการสร้างและเริ่มต้นหากกำลังทำงานอยู่จะยังคงทำงานอยู่
David Wasser

6
@Diffy เมื่อคุณโทรstartService()หากบริการไม่ทำงาน Android จะสร้างอินสแตนซ์ของคลาสบริการ (นี่คืออ็อบเจ็กต์บริการ) จากนั้นจะเรียกonCreate()ใช้อ็อบเจ็กต์นั้น จากนั้นจะเรียกonStartCommand()วัตถุนั้น หากในภายหลังคุณโทรมาอีกครั้งstartService()หากบริการยังคงทำงานอยู่ Android จะไม่สร้างวัตถุบริการใหม่ แต่จะเรียกonStartCommand()ใช้อ็อบเจ็กต์บริการที่มีอยู่แทน ที่ชัดเจน?
David Wasser

1
ผมรักคุณ! (y) ใช้งานได้เหมือนเวทมนตร์ (y) คำอธิบายที่ง่ายและดีมาก
Hilton Khadka

11

บริการจะเหมือนกันกับกิจกรรมอะไรก็ตามที่คุณต้องการassociateครั้งเดียวกับบริการจะเข้าสู่การonCreateเริ่มต้น

และเมื่อใดก็ตามserviceที่เรียกว่าใช้startService onStartCommandจะถูกเรียก และคุณสามารถผ่านการดำเนินการใด ๆ เพื่อดำเนินการ เช่นเดียวกับเครื่องเล่นเพลงคุณสามารถเล่นหยุดชั่วคราวหยุดใช้การกระทำ

และคุณดำเนินการใด ๆoperation in serviceโดยส่งการดำเนินการและรับเมื่อonStartCommand

onCreate ทำงานเหมือนตัวสร้าง

แก้ไขแบบย่อ

onCreate()โทรเฉพาะครั้งแรกที่คุณเริ่มในServiceขณะที่onStartCommand()โทรทุกครั้งที่คุณโทรstartServiceอีกครั้ง ช่วยให้คุณตั้งค่าการดำเนินการเช่นเล่นหยุดหยุดเพลงชั่วคราว

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}

ดังนั้นเมื่อฉันเรียกใช้บริการโดยใช้ startService (ความตั้งใจ) onCreate () จะไม่ถูกเรียกหรือไม่? ฉันมีข้อสงสัยในการทำความเข้าใจว่าอะไรคือ 'วัตถุบริการ' เพราะฉันเริ่มบริการโดย startSevice (ความตั้งใจ) มาโดยตลอด
Diffy

คุณได้สร้างอินสแตนซ์วัตถุบริการอย่างถูกต้องหรืออาจเป็นไปได้ว่าคุณไม่มีบริการในรายการของคุณ
AndroidGeek

เริ่มบริการเช่น startService (Intent ใหม่ (นี่คือ ServiceName.class));
AndroidGeek

แต่วิธีนี้เรียกว่าการสร้างอินสแตนซ์บริการหรือไม่? แล้ว service-object อยู่ที่ไหน?
Diffy

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