อะไรคือความแตกต่างระหว่าง sendStickyBroadcast และ sendBroadcast ใน Android


คำตอบ:


120

นี่คือสิ่งที่ Android SDK พูดเกี่ยวกับsendStickyBroadcast() :

ดำเนินการ sendBroadcast (Intent) ที่ "ติดหนึบ" ซึ่งหมายความว่า Intent ที่คุณกำลังส่งจะยังคงอยู่หลังจากการออกอากาศเสร็จสมบูรณ์เพื่อให้ผู้อื่นสามารถดึงข้อมูลนั้นได้อย่างรวดเร็วผ่านค่าที่ส่งคืนของ registerReceiver (BroadcastReceiver, IntentFilter) ในวิธีอื่น ๆ ทั้งหมดนี้จะทำงานเหมือนกับ sendBroadcast (Intent)

ACTION_BATTERY_CHANGEDตัวอย่างหนึ่งของการถ่ายทอดเหนียวส่งผ่านทางระบบปฏิบัติการ เมื่อคุณเรียกร้องregisterReceiver()ให้ดำเนินการนั้นแม้จะมีnull BroadcastReceiver- คุณจะได้รับการIntentถ่ายทอดครั้งสุดท้ายสำหรับการกระทำนั้น ดังนั้นคุณสามารถใช้สิ่งนี้เพื่อค้นหาสถานะของแบตเตอรี่โดยไม่จำเป็นต้องลงทะเบียนสำหรับการเปลี่ยนแปลงสถานะในอนาคตทั้งหมดของแบตเตอรี่


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

22
@phreed: "เมื่อคุณเรียก registerReceiver ครั้งที่สองจะกลับมามีเจตนาเดิมอีกหรือไม่" - ใช่ "อำนาจลง?" - มันหายไปเช่นเดียวกับทุกสิ่งใน RAM "ปิดหน้าจอ?" -- ไม่มีผลกระทบ.
CommonsWare

1
เพียงเพื่อเพิ่มที่ออกอากาศเหนียวมีกำลังใจอย่างเคร่งครัดโดยนางสาว Hackborn: groups.google.com/d/msg/android-developers/8341SaXhvmY/... เป็นโพสต์เก่า แต่ยังคงใช้ได้อยู่
Mr_and_Mrs_D

1
@ Commonsware: ฉันไม่เข้าใจประเด็นของคุณอธิบายด้วยตัวอย่างเจตนาปกติและด้วยตัวอย่างเจตนาที่เหนียวเหนอะหนะสำหรับสถานการณ์เดียวกันแล้วมันจะเป็นประโยชน์สำหรับฉันที่จะได้รับความคิดที่ชัดเจน
SIVAKUMAR.J

4
@Kushal: "แล้วทางเลือกอื่นสำหรับการออกอากาศแบบติดหนึบตอนนี้ควรเป็นอย่างไร" - ฉันไม่สามารถตอบได้อย่างแท้จริงเนื่องจากฉันไม่รู้ว่ากรณีการใช้งานของคุณคืออะไร คุณอาจลองถามคำถาม Stack Overflow ใหม่ซึ่งคุณจะอธิบายความต้องการทางธุรกิจของคุณอธิบายว่าคุณคิดจะแก้ปัญหาอย่างไรผ่านการออกอากาศแบบติดหนึบและขอวิธีอื่นในการแก้ปัญหาเดียวกันนั้น
CommonsWare

54

ประเภท : - ท้องถิ่นปกติสั่งและเหนียว

ออกอากาศปกติ

: - ใช้ sendBroadcast ()

: - ออกอากาศแบบอะซิงโครนัส

: - เครื่องรับใดก็ได้รับการออกอากาศไม่ใช่คำสั่งใด ๆ

สั่งออกอากาศ

: - ใช้ sendOrderBroadcast ()

: - ออกอากาศแบบซิงโครนัส

: - เครื่องรับสัญญาณรับการออกอากาศในฐานลำดับความสำคัญ

: - เราสามารถยกเลิกการออกอากาศในประเภทนี้ได้

ออกอากาศท้องถิ่น

: - ใช้เฉพาะเมื่อมีการใช้การออกอากาศภายในกระบวนการเดียวกันเท่านั้น

Sticky Broadcast

: - ความตั้งใจในการออกอากาศปกติจะไม่สามารถใช้งานได้อีกต่อไปหลังจากนี้ระบบจะส่งและประมวลผล

: - ใช้ sendStickyBroadcast (Intent)

: - เจตนาที่ตรงกันนั้นเหนียวหมายความว่าเจตนาที่คุณส่งจะยังคงอยู่หลังจากการออกอากาศเสร็จสิ้น

: - เนื่องจากสิ่งนี้คนอื่น ๆ สามารถดึงข้อมูลนั้นได้อย่างรวดเร็วผ่านค่าส่งคืนของ registerReceiver (BroadcastReceiver, IntentFilter)

: - นอกเหนือจากนี้เหมือนกับ sendBroadcast (Intent)


10

sendbroadcast() - ออกอากาศปกติ แต่เราสามารถกำหนดลำดับความสำคัญได้เช่นกัน

sendstickybroadcast()- ความตั้งใจที่ส่งมาพร้อมกับสิ่งนี้จะติดสำหรับผู้ใช้ในอนาคตที่ลงทะเบียนผ่านรหัส (ตัวรับแบบไดนามิก) การออกอากาศที่จะติดกับ Android และจะถูกส่งซ้ำหรือออกอากาศซ้ำตามคำขอในอนาคตจากเครื่องรับการออกอากาศใด ๆ

เมื่อมีคนส่งการออกอากาศแบบติดหนึบโดยใช้การออกอากาศsendstickyBroadcast(intent);นั้นจะพร้อมใช้งานสำหรับผู้ใช้ในอนาคตที่ใช้ตัวรับแบบไดนามิก

แต่ตอนนี้คุณไม่ควรใช้ sendStickyBroadcast()วิธีที่เลิกใช้แล้ว

จากเอกสาร Android:

วิธีนี้เลิกใช้แล้วใน API ระดับ 21 ไม่ควรใช้ Sticky broadcasts ไม่มีความปลอดภัย (ทุกคนสามารถเข้าถึงได้) ไม่มีการป้องกัน (ทุกคนสามารถแก้ไขได้) และปัญหาอื่น ๆ อีกมากมาย รูปแบบที่แนะนำคือการใช้การออกอากาศที่ไม่ติดหนึบเพื่อรายงานว่ามีบางอย่างเปลี่ยนแปลงไปโดยมีกลไกอื่นสำหรับแอปในการดึงค่าปัจจุบันเมื่อใดก็ตามที่ต้องการ

ฉันหวังว่านี่จะช่วยได้.

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