ความแตกต่างระหว่างSTART_STICKY
และSTART_NOT_STICKY
ในขณะที่การใช้บริการใน Android คืออะไร? ใครช่วยชี้ให้เห็นตัวอย่างมาตรฐาน ..
ความแตกต่างระหว่างSTART_STICKY
และSTART_NOT_STICKY
ในขณะที่การใช้บริการใน Android คืออะไร? ใครช่วยชี้ให้เห็นตัวอย่างมาตรฐาน ..
คำตอบ:
รหัสทั้งสองนั้นจะเกี่ยวข้องเมื่อโทรศัพท์มีหน่วยความจำไม่เพียงพอและฆ่าบริการก่อนที่จะดำเนินการเสร็จสิ้น START_STICKY
บอกให้ระบบปฏิบัติการสร้างบริการขึ้นมาใหม่หลังจากที่มีหน่วยความจำเพียงพอและโทรonStartCommand()
อีกครั้งด้วยเจตนาว่างเปล่า START_NOT_STICKY
แจ้งให้ระบบปฏิบัติการไม่ต้องสร้างบริการอีกครั้ง นอกจากนี้ยังมีรหัสที่สามSTART_REDELIVER_INTENT
ที่บอกให้ระบบปฏิบัติการสร้างบริการขึ้นใหม่และส่งมอบเจตนาเดิมonStartCommand()
อีกครั้ง
บทความโดย Dianne Hackborn อธิบายพื้นหลังของเรื่องนี้ดีกว่าเอกสารอย่างเป็นทางการ
ที่มา: http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html
ส่วนสำคัญที่นี่คือรหัสผลลัพธ์ใหม่ที่ส่งคืนโดยฟังก์ชั่นโดยบอกระบบว่าควรทำอย่างไรกับบริการหากกระบวนการถูกฆ่าขณะที่กำลังทำงาน:
START_STICKY นั้นเหมือนกันกับพฤติกรรมที่ผ่านมาซึ่งเป็นบริการที่ "เริ่มต้น" และระบบจะเริ่มต้นใหม่ในภายหลัง ข้อแตกต่างจากแพลตฟอร์มรุ่นก่อนหน้าคือหากได้รับการเริ่มต้นใหม่เนื่องจากกระบวนการถูกฆ่า onStartCommand () จะถูกเรียกใช้ในอินสแตนซ์ถัดไปของบริการด้วยเจตนาแบบ null แทนที่จะไม่ถูกเรียกเลย บริการที่ใช้โหมดนี้ควรตรวจสอบกรณีนี้และจัดการกับมันอย่างเหมาะสม
START_NOT_STICKY กล่าวว่าหลังจากกลับมาจาก onStartCreated () หากกระบวนการถูกฆ่าโดยไม่มีคำสั่งเริ่มต้นที่เหลืออยู่เพื่อส่งมอบบริการจะหยุดทำงานแทนการเริ่มใหม่ สิ่งนี้เหมาะสมสำหรับบริการที่ต้องการเรียกใช้เฉพาะในขณะที่ดำเนินการคำสั่งที่ส่งถึงพวกเขาเท่านั้น ตัวอย่างเช่นบริการอาจเริ่มทุก ๆ 15 นาทีจากการเตือนภัยเพื่อสำรวจสถานะเครือข่ายบางอย่าง ถ้ามันถูกฆ่าขณะทำงานนั้นมันจะเป็นการดีที่สุดถ้าปล่อยให้มันหยุดและเริ่มใหม่ในครั้งต่อไปที่สัญญาณเตือนไฟไหม้
START_REDELIVER_INTENT นั้นเป็นเหมือน START_NOT_STICKY ยกเว้นว่ากระบวนการของบริการนั้นถูกฆ่าก่อนที่มันจะหยุด stopSelf () เพื่อจุดประสงค์ที่กำหนดความตั้งใจนั้นจะถูกส่งอีกครั้งจนกว่าจะเสร็จสมบูรณ์ (เว้นแต่หลังจากพยายามอีกหลายครั้งก็ยังไม่เสร็จสมบูรณ์ ตรงจุดที่ระบบยอมแพ้) สิ่งนี้มีประโยชน์สำหรับบริการที่รับคำสั่งงานที่ต้องทำและต้องการให้แน่ใจว่าในที่สุดพวกเขาจะทำงานให้เสร็จสมบูรณ์สำหรับแต่ละคำสั่งที่ส่ง
START_NOT_STICKY
?
START_REDELIVER_INTENT
เป็นเช่นSTART_NOT_STICKY
นั้น แต่มันเป็นเหมือนSTART_STICKY
ความแตกต่าง:
ระบบจะพยายามสร้างบริการของคุณใหม่หลังจากที่ถูกฆ่าแล้ว
ระบบจะไม่พยายามสร้างบริการของคุณใหม่หลังจากถูกฆ่า
ตัวอย่างมาตรฐาน:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
START_REDELIVER_INTENT
ได้อย่างไร ฉันเพิ่งทดสอบSTART_STICKY
และฆ่าแอพโดยแอพล่าสุด จากนั้นจะเรียกคืนบริการ แต่START_REDELIVER_INTENT
ไม่เคยเรียกอีกครั้ง ทำไม?
เอกสารสำหรับSTART_STICKY
และSTART_NOT_STICKY
ค่อนข้างตรงไปตรงมา
หากกระบวนการของบริการนี้ถูกฆ่าตายในขณะที่มันเริ่มต้น (หลังจากกลับมาจาก
onStartCommand(Intent, int, int))
นั้นปล่อยให้มันอยู่ในสถานะที่เริ่มต้น แต่ไม่ได้เก็บไว้เจตนาที่ส่งมอบในภายหลังระบบจะพยายามสร้างบริการอีกครั้งเพราะมันอยู่ในสถานะเริ่มต้น มันจะรับประกันว่าจะโทรonStartCommand(Intent, int, int)
หลังจากที่สร้างอินสแตนซ์บริการใหม่หากไม่มีคำสั่งเริ่มต้นที่รอดำเนินการที่จะส่งมอบให้กับบริการมันจะถูกเรียกด้วยวัตถุเจตนาเป็นโมฆะดังนั้นคุณจะต้องตรวจสอบเรื่องนี้ด้วยโหมดนี้เหมาะสมสำหรับสิ่งต่าง ๆ ที่จะเริ่มต้นอย่างชัดเจนและหยุดเพื่อให้ทำงานตามระยะเวลาที่กำหนดเช่นบริการเล่นเพลงพื้นหลัง
ตัวอย่าง: ตัวอย่างบริการท้องถิ่น
ถ้ากระบวนการของบริการนี้ถูกฆ่าตายในขณะที่มีการเริ่มต้น (หลังจากกลับมาจาก
onStartCommand(Intent, int, int))
และไม่มีเจตนาเริ่มต้นใหม่ในการส่งมอบไปแล้วใช้บริการออกจากรัฐที่ตั้งขึ้นและไม่สร้างจนกว่าจะมีการโทรอย่างชัดเจนในอนาคตContext.startService(Intent)
. บริการ จะไม่ได้รับการonStartCommand(Intent, int, int)
โทรด้วยnull
เจตนาเพราะจะไม่สามารถเริ่มต้นใหม่ได้หากไม่มีความตั้งใจที่รอส่งโหมดนี้เหมาะสมสำหรับสิ่งที่ต้องการทำงานบางอย่างอันเป็นผลมาจากการเริ่มต้น แต่สามารถหยุดได้เมื่ออยู่ภายใต้แรงกดดันหน่วยความจำและจะเริ่มต้นตัวเองอีกครั้งในภายหลังเพื่อทำงานให้ชัดเจนยิ่งขึ้น ตัวอย่างของบริการดังกล่าวจะเป็นสิ่งที่โพลสำหรับข้อมูลจากเซิร์ฟเวอร์: มันสามารถกำหนดเวลาการเตือนภัยเพื่อสำรวจความคิดเห็นทุก ๆ
N
นาทีโดยให้การเตือนเริ่มต้นบริการ เมื่อonStartCommand(Intent, int, int)
ถูกเรียกจากการเตือนภัยจะกำหนดเวลาการเตือนใหม่เป็นเวลา N นาทีต่อมาและวางไข่เธรดเพื่อสร้างเครือข่าย หากกระบวนการถูกฆ่าตายในขณะที่ทำการตรวจสอบนั้นบริการจะไม่ถูกรีสตาร์ทจนกว่าสัญญาณเตือนจะดับ
ตัวอย่าง: ServiceStartArguments.java