Broadcast Receiver คือคอมโพเนนต์ของ Android ที่รับฟังและประมวลผลข้อความ Broadcast ของระบบ เช่น การเปลี่ยนแปลงสถานะเครือข่าย ระดับแบตเตอรี่ การรับ SMS หรือการติดตั้งแอป โดยระบบปฏิบัติการจะเริ่มทำงานเมื่อมีเหตุการณ์เกิดขึ้นและดำเนินงานบนเธรดหลักหรือผ่านบริการพื้นหลัง ตาม Android Developer Guide, 2026 Broadcast Receiver ช่วยให้แอปพลิเคชันตอบสนองต่อเหตุการณ์ของระบบทั่วโลกได้แม้ไม่ได้ทำงานอยู่ ทำให้เป็นกลไกสำคัญสำหรับการประมวลผลเหตุการณ์พื้นหลังในระบบนิเวศของ Android
ประเด็นสำคัญ
Broadcast Receiver คือคอมโพเนนต์ของ Android ที่ออกแบบมาเพื่อรับและประมวลผลข้อความ Intent ที่เผยแพร่โดยระบบปฏิบัติการหรือแอปพลิเคชันอื่น แตกต่างจาก Activity และ Service ตรงที่ Broadcast Receiver ไม่มีส่วนติดต่อผู้ใช้ — หน้าที่ของมันคือดำเนินการสั้น ๆ เมื่อมีเหตุการณ์เกิดขึ้น
Broadcast Receiver ทำงานผ่านกลไก Intent ระบบหรือแอปพลิเคชันส่ง Intent ผ่าน sendBroadcast หรือ sendOrderedBroadcast และระบบปฏิบัติการจะส่งต่อไปยังตัวรับสัญญาณที่ลงทะเบียนไว้ ตัวรับสัญญาณแต่ละตัวจะรับ Intent ในเมธอด onReceive ซึ่งทำงานบนเธรดหลัก
ตาม Android Compatibility Definition Document Broadcast Receiver ต้องดำเนินการ onReceive ให้เสร็จภายใน 10 วินาที — มิฉะนั้นระบบจะถือว่าค้างและยุติกระบวนการ สำหรับงานพื้นหลังที่ยาวนาน ให้ใช้ JobScheduler หรือ WorkManager ที่เริ่มจากตัวรับสัญญาณ
Android รองรับ Broadcast สองประเภทหลัก: Normal Broadcast และ Ordered Broadcast ความแตกต่างอยู่ที่ลำดับการส่งและความสามารถในการขัดจังหวะห่วงโซ่การประมวลผล นอกจากนี้ Broadcast ยังแบ่งเป็นของระบบ (สร้างโดย OS) และแบบกำหนดเอง (สร้างโดยแอปพลิเคชัน)
Normal Broadcast จะถูกส่งถึงตัวรับสัญญาณที่ลงทะเบียนทั้งหมดแบบอะซิงโครนัสโดยไม่มีลำดับที่รับประกัน ระบบสามารถประมวลผล Broadcast เหล่านี้แบบขนาน — ตัวรับสัญญาณแต่ละตัวได้รับ Intent ในเธรดของตัวเอง การเรียก abortBroadcast บน Normal Broadcast ไม่มีผล: ไม่สามารถยกเลิกการส่งไปยังตัวรับสัญญาณอื่นได้
Ordered Broadcast จะถูกส่งตามลำดับ — ไปยังแต่ละตัวรับสัญญาณตามลำดับจากมากไปน้อยของแอตทริบิวต์ android:priority (จาก 0 ถึง 999) หลังจากการประมวลผล ตัวรับสัญญาณสามารถส่งผลลัพธ์ไปยังตัวถัดไปผ่าน setResultExtras หรือขัดจังหวะห่วงโซ่โดยเรียก abortBroadcast ใช้ในสถานการณ์ที่ลำดับการประมวลผลสำคัญ — ตัวอย่างเช่น ตัวรับสัญญาณ SMS
Android สร้าง Broadcast ของระบบ มากมาย: ACTION_BOOT_COMPLETED (การบูตเครื่อง), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED และอื่น ๆ แต่ละ Intent มีข้อมูลเพิ่มเติมใน Extras — ระดับแบตเตอรี่ ประเภทการเชื่อมต่อ ชื่อแพ็คเกจ
| ประเภท Broadcast | ลำดับ | abortBroadcast | ประสิทธิภาพ |
|---|---|---|---|
| Normal | ไม่รับประกัน | ใช้ไม่ได้ | สูง (ขนาน) |
| Ordered | ตามลำดับความสำคัญ | ใช้ได้ | ปานกลาง (ตามลำดับ) |
| Sticky | ค่าเดียว | ไม่สามารถใช้ได้ | ต่ำ (เลิกใช้ตั้งแต่ API 21) |
Sticky Broadcast เป็นประเภทที่เลิกใช้แล้วซึ่งเก็บค่าสุดท้ายที่ส่งไว้ ให้ใช้ LiveData, StateFlow หรือ SharedPreferences ที่ใช้ร่วมกันเพื่อเก็บสถานะล่าสุดแทน
Broadcast Receiver สามารถลงทะเบียนได้สองวิธี: แบบคงที่ ผ่าน AndroidManifest.xml หรือ แบบไดนามิก ในโค้ดผ่าน registerReceiver การเลือกขึ้นอยู่กับสถานการณ์: การลงทะเบียนแบบคงที่ทำงานแม้แอปพลิเคชันไม่ได้ทำงานอยู่ การลงทะเบียนแบบไดนามิกทำงานเฉพาะเมื่อคอมโพเนนต์ที่ลงทะเบียนยังทำงานอยู่
การลงทะเบียนแบบคงที่ประกาศใน manifest ด้วยแท็ก <receiver> ภายใน <application> สำหรับตัวรับสัญญาณแต่ละตัว จะระบุคลาสตัวจัดการและตัวกรอง Intent พร้อมการดำเนินการที่จะสกัดกั้น ระบบจะโหลดตัวรับสัญญาณเหล่านี้เมื่อมี Broadcast เกิดขึ้นแม้แอปพลิเคชันไม่ได้ทำงานอยู่
<!-- Static Broadcast Receiver registration in manifest -->
<receiver android:name=".BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
การลงทะเบียนแบบไดนามิกดำเนินการโดยใช้เมธอด registerReceiver ในโค้ดของ Activity, Service หรือ Fragment ตัวรับสัญญาณจะมีชีวิตอยู่ตราบเท่าที่คอมโพเนนต์ที่ลงทะเบียนยังทำงานอยู่ ให้เรียก unregisterReceiver ใน onPause หรือ onDestroy เสมอ — มิฉะนั้นจะเกิดหน่วยความจำรั่วและระบบอาจยุติกระบวนการ
สำหรับ Ordered Broadcast ลำดับการส่งถูกกำหนดโดยแอตทริบิวต์ android:priority ตัวรับสัญญาณที่มีลำดับความสำคัญสูงกว่าจะได้รับ Intent ก่อน หากเรียก abortBroadcast หลังการประมวลผล ตัวรับสัญญาณที่มีลำดับความสำคัญต่ำกว่าจะไม่ได้รับ Intent สำหรับตัวรับสัญญาณแบบคงที่ ลำดับความสำคัญถูกตั้งค่าในตัวกรอง Intent ของ manifest
ตัวรับสัญญาณใน Ordered Broadcast สามารถส่งข้อมูลไปยังตัวถัดไปในห่วงโซ่ผ่าน setResultExtras หรือ setResultData ซึ่งช่วยให้การประมวลผลแบบไปป์ไลน์: ตัวรับสัญญาณแรกเพิ่มข้อมูลเสริมให้ Intent ตัวที่สองใช้ข้อมูลเหล่านั้น ตัวที่สามทำให้ห่วงโซ่สมบูรณ์ เมธอด getResultExtras อ่านข้อมูลที่ส่งโดยตัวรับสัญญาณก่อนหน้า
สำหรับ Normal Broadcast ลำดับไม่ได้รับการรับประกัน ดังนั้นตัวรับสัญญาณทั้งหมดจึงได้รับ Intent เดิมที่ไม่มีการเปลี่ยนแปลง หากคุณต้องการให้ตัวรับสัญญาณมีผลต่อกัน ให้ใช้ sendOrderedBroadcast แทน sendBroadcast
Android 8 (API 26, Oreo) นำข้อจำกัดที่สำคัญมาใช้กับ Broadcast พื้นหลัง Broadcast โดยนัยส่วนใหญ่ — ที่ไม่ได้ระบุถึงแอปพลิเคชันเฉพาะ — ไม่ทำงานกับการลงทะเบียนแบบคงที่อีกต่อไป ระบบบล็อกตัวรับสัญญาณที่ลงทะเบียนใน manifest สำหรับการดำเนินการเช่น CONNECTIVITY_ACTION หรือ ACTION_BATTERY_LOW
Google กำหนดรายการ Broadcast ที่ยังคงทำงานกับการลงทะเบียนแบบคงที่: BOOT_COMPLETED, TIME_TICK, Alarm และการเปลี่ยนแปลงแพ็คเกจ — รวมประมาณสิบกว่าข้อยกเว้น Broadcast โดยนัยอื่น ๆ ทั้งหมดตอนนี้ต้องการการลงทะเบียนแบบไดนามิกผ่าน Context.registerReceiver ซึ่งทำงานเฉพาะเมื่อแอปอยู่ในเบื้องหน้า
สำหรับงานพื้นหลังที่เคยจัดการผ่าน Broadcast Receiver Android แนะนำ WorkManager (งานที่เลื่อนออกไปพร้อมรับประกันการดำเนินการ), JobScheduler (งานตามระยะเวลาโดยพิจารณาสถานะอุปกรณ์) และ NotificationListenerService (การตรวจสอบการแจ้งเตือน) คอมโพเนนต์เหล่านี้ทำงานโดยไม่มีข้อจำกัด Android 8 และปรับให้เหมาะสมกับการใช้พลังงาน
มาสร้าง Broadcast Receiver สำหรับติดตามการเชื่อมต่อเครือข่ายกัน ตัวรับสัญญาณจะจับ Broadcast CONNECTIVITY_ACTION และบันทึกประเภทการเชื่อมต่อ สำหรับ Android 8+ เราจะลงทะเบียนแบบไดนามิกเนื่องจากเป็น Broadcast โดยนัยที่ถูกแยกออกจากการลงทะเบียนแบบคงที่
// Broadcast Receiver สำหรับติดตามสถานะเครือข่าย
class NetworkReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = cm.activeNetwork
val caps = cm.getNetworkCapabilities(network)
val connectionType = when {
caps?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true -> "WiFi"
caps?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true -> "Cellular"
else -> "Disconnected"
}
Log.d("NetworkReceiver", "ประเภทการเชื่อมต่อ: $connectionType")
}
}
// การลงทะเบียนแบบไดนามิกใน Activity
class MainActivity : AppCompatActivity() {
private val networkReceiver = NetworkReceiver()
override fun onStart() {
super.onStart()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(networkReceiver, filter)
}
override fun onStop() {
super.onStop()
unregisterReceiver(networkReceiver)
}
}
ยกเลิกการลงทะเบียนตัวรับสัญญาณใน onStop เสมอ — หาก Activity ไปที่พื้นหลังแต่ตัวรับสัญญาณยังคงลงทะเบียนอยู่ ระบบจะไม่สามารถปล่อยทรัพยากรได้ สำหรับ Service ให้ใช้ onDestroy ใน Fragment ให้ลงทะเบียนตัวรับสัญญาณใน onStart และยกเลิกใน onStop ตามวงจรชีวิตของ Fragment
คำถามที่พบบ่อย
Broadcast Receiver คือคอมโพเนนต์ Android สำหรับประมวลผลข้อความ Broadcast ของระบบและแบบกำหนดเอง โดยรับ Intent ในเมธอด onReceive ซึ่งทำงานบนเธรดหลัก และต้องเสร็จภายใน 10 วินาที สำหรับงานที่ยาวนาน ให้ใช้ WorkManager หรือ JobScheduler
Normal Broadcast ถูกส่งถึงตัวรับสัญญาณทั้งหมดแบบอะซิงโครนัสและขนาน — ลำดับไม่รับประกัน abortBroadcast ใช้ไม่ได้ Ordered Broadcast ถูกส่งตามลำดับตามลำดับความสำคัญ ตัวรับสัญญาณแต่ละตัวสามารถขัดจังหวะห่วงโซ่หรือส่งข้อมูลไปยังตัวถัดไปผ่าน setResultExtras
การลงทะเบียนแบบคงที่ (ใน manifest) ช่วยให้ตัวรับสัญญาณทำงานได้แม้แอปพลิเคชันไม่ได้ทำงานอยู่ การลงทะเบียนแบบไดนามิก (ผ่าน registerReceiver) ทำงานเฉพาะเมื่อคอมโพเนนต์ที่ลงทะเบียนยังทำงานอยู่ ตั้งแต่ Android 8 เป็นต้นมา Broadcast โดยนัยหลายรายการต้องการการลงทะเบียนแบบไดนามิก
Android 8 (API 26) ห้ามการลงทะเบียนแบบคงที่สำหรับ Broadcast โดยนัยส่วนใหญ่ เช่น CONNECTIVITY_ACTION หรือ ACTION_BATTERY_LOW ข้อยกเว้นรวมถึง BOOT_COMPLETED, Alarm, เวลา และอื่น ๆ อีกสองสามรายการ สำหรับงานพื้นหลัง ให้ใช้ WorkManager แทน Broadcast
ใช้ LiveData, StateFlow, EventBus หรือ LocalBroadcastManager เพื่อส่งข้อมูลจาก onReceive ไปยัง UI อย่าพยายามอัปเดต UI โดยตรงจาก onReceive — มันทำงานบนเธรดหลัก แต่ตัวรับสัญญาณไม่รับประกันว่า Activity จะมองเห็นได้ LocalBroadcastManager เป็นตัวเลือกที่เลิกใช้แล้วสำหรับการสื่อสารภายใน
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม