Sticky Broadcast คืออะไร?


90

ฉันเจอคำนี้ในเอกสาร Android พร้อมคำจำกัดความที่มาพร้อมกัน

สิ่งเหล่านี้เป็นการออกอากาศที่ระบบเก็บข้อมูลไว้หลังจากเสร็จสิ้นเพื่อให้ไคลเอนต์สามารถดึงข้อมูลนั้นได้อย่างรวดเร็วโดยไม่ต้องรอการออกอากาศครั้งต่อไป

หมายความว่าอย่างไร? มีใครสามารถอธิบายการใช้งานด้วยตัวอย่างเฉพาะได้หรือไม่? ฉันเชื่อว่าเราต้องขออนุญาตเพื่อใช้เจตนานี้? ทำไมล่ะ?

<uses-permission android:name="android.permission.BROADCAST_STICKY"/> - Allows an application to broadcast sticky intents.

3
08 / ก.พ. / 2019 สำหรับใครก็ตามที่ค้นหาการออกอากาศแบบติดหนึบและสิ้นสุดที่นี่จากofficial doc Sticky broadcasts should not be used. They provide no security (anyone can access them), no protection (anyone can modify them), and many other problems. The recommended pattern is to use a non-sticky broadcast to report that something has changed, with another mechanism for apps to retrieve the current value whenever desired.
fangzhzh

คำตอบ:


110

หากกิจกรรมเรียกร้องonPauseด้วยการออกอากาศปกติการรับการออกอากาศอาจพลาดได้ สามารถตรวจสอบการออกอากาศแบบติดหนึบได้หลังจากเริ่มต้นonResumeแล้ว

อัปเดต 23/6/2020

เลิกใช้งานการแพร่ภาพแบบติดหนึบแล้ว

โปรดดูsendStickyBroadcastเอกสาร

วิธีนี้เลิกใช้แล้วใน API ระดับ 21

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

ดำเนินการ

Intent intent = new Intent("some.custom.action");
intent.putExtra("some_boolean", true);
sendStickyBroadcast(intent);

ทรัพยากร


สวัสดีฉันเริ่มสับสนกับการออกอากาศแบบติดหนึบกับการลงทะเบียนการออกอากาศแบบคงที่ ฉันเพิ่งอ่านที่ไหนสักแห่งว่าความแตกต่างระหว่างการลงทะเบียนการออกอากาศในไฟล์รายการและการลงทะเบียนแบบเป็นโปรแกรมเป็นเพียงการที่รายการอื่นไม่ได้ยกเลิกการลงทะเบียนการออกอากาศ แต่จะอยู่ที่นั่นในขณะที่รายการต่อไปจะยกเลิกการลงทะเบียนการออกอากาศในเมธอด onPause ()
Shaista Naaz

หมายเหตุ: ในกรณีส่วนใหญ่ควรหลีกเลี่ยงการกระจายสัญญาณแบบติดหนึบ ดูลิงก์ในคำตอบจาก @Nikhil_Katreสำหรับข้อมูลเพิ่มเติม
gMale

@Shaista: เครื่องรับรายการทำงานแม้ว่าแอปของคุณจะไม่อยู่เฉยๆในขณะที่ตัวรับแบบเป็นโปรแกรมจะตอบสนองเฉพาะเมื่อแอปพลิเคชันที่ลงทะเบียนภายในกำลังทำงานอยู่
gMale

@gmale ดังนั้นถ้าเราเป็นกิจกรรมและเราอยู่ใน onPause () และเราได้เรียกว่า unregisterReceiver () .. เราจะได้รับการถ่ายทอดเมื่อเราดำเนินการต่อใน onResume ()
Kushal

1
@PaulBurke ฉันไม่พบชื่อMark Murphyในลิงค์ด้านบน ลิงก์นี้เปลี่ยนเส้นทางฉันไปยังคำถามที่ไม่ใช่คำตอบที่แน่นอน คุณช่วยปรับปรุง URL ได้ไหม.
Vishal Chhodwani

11

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


8

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

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


3

Intent การออกอากาศปกติจะไม่สามารถใช้ได้อีกต่อไปหลังจากถูกส่งและประมวลผลโดยระบบ หากคุณใช้เมธอด sendStickyBroadcast (Intent) Intent จะเหนียวหมายความว่า Intent ที่คุณส่งจะยังคงอยู่หลังจากการออกอากาศเสร็จสิ้น

คุณอ้างถึงบล็อกของฉัน: ป้อนคำอธิบายลิงก์ที่นี่


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