ภาพรวมการออกอากาศ

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

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

แอปสามารถลงทะเบียนเพื่อรับการออกอากาศที่เฉพาะเจาะจง เมื่อมีการส่งประกาศ ระบบจะกำหนดเส้นทางการเผยแพร่ไปยังแอปที่สมัครใช้บริการโดยอัตโนมัติ ได้รับการออกอากาศประเภทนั้นๆ

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

เกี่ยวกับการออกอากาศของระบบ

ระบบจะส่งประกาศโดยอัตโนมัติเมื่อเกิดเหตุการณ์ของระบบต่างๆ เช่น เมื่อระบบเปลี่ยนเข้าและออกจากโหมดบนเครื่องบิน ระบบ ระบบจะส่งประกาศไปยังแอปทั้งหมดที่สมัครใช้บริการเพื่อรับ กิจกรรม

ตัวข้อความออกอากาศเองรวมอยู่ในIntent ที่มีสตริงการดำเนินการระบุเหตุการณ์ที่เกิดขึ้น (เช่น android.intent.action.AIRPLANE_MODE) Intent ดังกล่าวอาจรวมถึง รวมข้อมูลเพิ่มเติมไว้ในช่องพิเศษด้วย เช่น เครื่องบิน Intent ในโหมดมีบูลีนเพิ่มเติมที่ระบุว่ามีเครื่องบินหรือไม่ โหมดเปิดอยู่

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีอ่าน Intent และรับสตริงการดำเนินการจาก Intent โปรดดูความตั้งใจและความตั้งใจ ตัวกรอง

สำหรับรายการการดำเนินการเผยแพร่ทั้งหมดของระบบ โปรดดูที่ BROADCAST_ACTIONS.TXT ใน Android SDK การดำเนินการออกอากาศแต่ละรายการจะมี ฟิลด์คงที่ที่เกี่ยวข้อง เช่น ค่าของคงที่ ACTION_AIRPLANE_MODE_CHANGED คือ android.intent.action.AIRPLANE_MODE เอกสารประกอบสำหรับการออกอากาศแต่ละครั้ง ใช้ได้ในฟิลด์ค่าคงที่ที่เกี่ยวข้อง

การเปลี่ยนแปลงการออกอากาศของระบบ

ในขณะที่แพลตฟอร์ม Android พัฒนาขึ้นเรื่อยๆ ก็จะมีการเปลี่ยนแปลงวิธีออกอากาศของระบบเป็นระยะๆ มากขึ้น โปรดคํานึงถึงการเปลี่ยนแปลงต่อไปนี้เพื่อรองรับ Android ทุกเวอร์ชัน

Android 14

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

การออกอากาศที่สำคัญที่ประกาศใน ไฟล์ Manifest จะนำแอปออกจากแคชชั่วคราว สำหรับการจัดส่ง

Android 9

เริ่มตั้งแต่ Android 9 (API ระดับ 28) NETWORK_STATE_CHANGED_ACTION ไม่ได้รับข้อมูลเกี่ยวกับตำแหน่งของผู้ใช้งานหรือส่วนตัว ข้อมูลที่ระบุตัวตนได้

นอกจากนี้ หากติดตั้งแอปไว้ในอุปกรณ์ที่ใช้ Android 9 ขึ้นไป ระบบที่กระจายข้อมูลจาก Wi-Fi ไม่มี SSID, BSSID และการเชื่อมต่อ หรือสแกนผลลัพธ์ หากต้องการรับข้อมูลนี้ โปรดโทร getConnectionInfo() แทน

Android 8.0

เริ่มตั้งแต่ Android 8.0 (API ระดับ 26) ระบบเพิ่ม ข้อจำกัดเกี่ยวกับตัวรับที่ประกาศไฟล์ Manifest

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

Android 7.0

Android 7.0 (API ระดับ 24) ขึ้นไปจะไม่ส่งระบบต่อไปนี้ ประกาศ:

นอกจากนี้ แอปที่กำหนดเป้าหมายเป็น Android 7.0 ขึ้นไปต้องลงทะเบียนการออกอากาศ CONNECTIVITY_ACTION ด้วย registerReceiver(BroadcastReceiver, IntentFilter) การประกาศตัวรับในไฟล์ Manifest ไม่ทำงาน

กำลังรับการออกอากาศ

แอปรับการออกอากาศได้ 2 วิธีด้วยกัน ได้แก่ ผ่านตัวรับที่ประกาศไฟล์ Manifest และรีซีฟเวอร์ที่ลงทะเบียนตามบริบท

ตัวรับที่ประกาศโดยใช้ไฟล์ Manifest

ถ้าคุณประกาศ Broadcast Receiver ในไฟล์ Manifest ของคุณ ระบบจะเปิดใช้งาน (หากแอปไม่ได้ทำงานอยู่แล้ว) เมื่อมีการส่งการออกอากาศ

หากต้องการประกาศ Broadcast Receiver ในไฟล์ Manifest ให้ทำตามขั้นตอนต่อไปนี้

  1. ระบุ <receiver> ในไฟล์ Manifest ของแอป

    <!-- If this receiver listens for broadcasts sent from the system or from
         other apps, even other apps that you own, set android:exported to "true". -->
    <receiver android:name=".MyBroadcastReceiver" android:exported="false">
        <intent-filter>
            <action android:name="APP_SPECIFIC_BROADCAST" />
        </intent-filter>
    </receiver>
    

    ตัวกรอง Intent จะระบุการดำเนินการออกอากาศที่ผู้รับสมัครใช้บริการ

  2. คลาสย่อย BroadcastReceiver และใช้ onReceive(Context, Intent) Broadcast Receiver ในบันทึกตัวอย่างต่อไปนี้ และแสดงเนื้อหา ของการออกอากาศ

    Kotlin

    private const val TAG = "MyBroadcastReceiver"
    
    class MyBroadcastReceiver : BroadcastReceiver() {
    
        override fun onReceive(context: Context, intent: Intent) {
            StringBuilder().apply {
                append("Action: ${intent.action}\n")
                append("URI: ${intent.toUri(Intent.URI_INTENT_SCHEME)}\n")
                toString().also { log ->
                    Log.d(TAG, log)
    
                    val binding = ActivityNameBinding.inflate(layoutInflater)
                    val view = binding.root
                    setContentView(view)
    
                    Snackbar.make(view, log, Snackbar.LENGTH_LONG).show()
                }
            }
        }
    }
    

    Java

    public class MyBroadcastReceiver extends BroadcastReceiver {
            private static final String TAG = "MyBroadcastReceiver";
            @Override
            public void onReceive(Context context, Intent intent) {
                StringBuilder sb = new StringBuilder();
                sb.append("Action: " + intent.getAction() + "\n");
                sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
                String log = sb.toString();
                Log.d(TAG, log);
    
                ActivityNameBinding binding =
                        ActivityNameBinding.inflate(layoutInflater);
                val view = binding.root;
                setContentView(view);
    
                Snackbar.make(view, log, Snackbar.LENGTH_LONG).show();
            }
        }
    

    หากต้องการเปิดใช้การเชื่อมโยงมุมมอง กำหนดค่า viewBinding ในระดับโมดูลของคุณ ไฟล์ create.gradle

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

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

รีซีฟเวอร์ที่มีการลงทะเบียนตามบริบท

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

หากต้องการลงทะเบียนตัวรับกับบริบท ให้ทำตามขั้นตอนต่อไปนี้

  1. ในไฟล์บิลด์ระดับโมดูลของแอป ให้ใส่เวอร์ชัน 1.9.0 ขึ้นไป ไลบรารี AndroidX Core ดังนี้

    Groovy

    dependencies {
        def core_version = "1.13.1"
    
        // Java language implementation
        implementation "androidx.core:core:$core_version"
        // Kotlin
        implementation "androidx.core:core-ktx:$core_version"
    
        // To use RoleManagerCompat
        implementation "androidx.core:core-role:1.0.0"
    
        // To use the Animator APIs
        implementation "androidx.core:core-animation:1.0.0"
        // To test the Animator APIs
        androidTestImplementation "androidx.core:core-animation-testing:1.0.0"
    
        // Optional - To enable APIs that query the performance characteristics of GMS devices.
        implementation "androidx.core:core-performance:1.0.0"
    
        // Optional - to use ShortcutManagerCompat to donate shortcuts to be used by Google
        implementation "androidx.core:core-google-shortcuts:1.1.0"
    
        // Optional - to support backwards compatibility of RemoteViews
        implementation "androidx.core:core-remoteviews:1.1.0"
    
        // Optional - APIs for SplashScreen, including compatibility helpers on devices prior Android 12
        implementation "androidx.core:core-splashscreen:1.2.0-alpha01"
    }
    

    Kotlin

    dependencies {
        val core_version = "1.13.1"
    
        // Java language implementation
        implementation("androidx.core:core:$core_version")
        // Kotlin
        implementation("androidx.core:core-ktx:$core_version")
    
        // To use RoleManagerCompat
        implementation("androidx.core:core-role:1.0.0")
    
        // To use the Animator APIs
        implementation("androidx.core:core-animation:1.0.0")
        // To test the Animator APIs
        androidTestImplementation("androidx.core:core-animation-testing:1.0.0")
    
        // Optional - To enable APIs that query the performance characteristics of GMS devices.
        implementation("androidx.core:core-performance:1.0.0")
    
        // Optional - to use ShortcutManagerCompat to donate shortcuts to be used by Google
        implementation("androidx.core:core-google-shortcuts:1.1.0")
    
        // Optional - to support backwards compatibility of RemoteViews
        implementation("androidx.core:core-remoteviews:1.1.0")
    
        // Optional - APIs for SplashScreen, including compatibility helpers on devices prior Android 12
        implementation("androidx.core:core-splashscreen:1.2.0-alpha01")
    }
    
  2. สร้างอินสแตนซ์ของ BroadcastReceiver:

    Kotlin

    val br: BroadcastReceiver = MyBroadcastReceiver()
    

    Java

    BroadcastReceiver br = new MyBroadcastReceiver();
    
  3. สร้างอินสแตนซ์ของ IntentFilter:

    Kotlin

    val filter = IntentFilter(APP_SPECIFIC_BROADCAST)
    

    Java

    IntentFilter filter = new IntentFilter(APP_SPECIFIC_BROADCAST);
    
  4. เลือกว่าจะส่งออก Broadcast Receiver หรือไม่และเปิดเผยต่อ แอปอื่นๆ บนอุปกรณ์ หากเครื่องรับนี้กำลังฟังการออกอากาศที่ส่ง จากระบบหรือจากแอปอื่นๆ รวมถึงแอปอื่นๆ ที่คุณเป็นเจ้าของ ให้ใช้ แฟล็ก RECEIVER_EXPORTED หากตัวรับนี้ฟังเฉพาะ รายการที่แอปของคุณส่ง ให้ใช้ธง RECEIVER_NOT_EXPORTED

    Kotlin

    val listenToBroadcastsFromOtherApps = false
    val receiverFlags = if (listenToBroadcastsFromOtherApps) {
        ContextCompat.RECEIVER_EXPORTED
    } else {
        ContextCompat.RECEIVER_NOT_EXPORTED
    }
    

    Java

    boolean listenToBroadcastsFromOtherApps = false;
    if (listenToBroadcastsFromOtherApps) {
        receiverFlags = ContextCompat.RECEIVER_EXPORTED;
    } else {
        receiverFlags = ContextCompat.RECEIVER_NOT_EXPORTED;
    }
    
  5. ลงทะเบียนผู้รับด้วยการโทร registerReceiver():

    Kotlin

    ContextCompat.registerReceiver(context, br, filter, receiverFlags)
    

    Java

    ContextCompat.registerReceiver(context, br, filter, receiverFlags);
    
  6. หากต้องการหยุดรับการประกาศ โปรดโทรหา unregisterReceiver(android.content.BroadcastReceiver) อย่าลืมยกเลิกการลงทะเบียนตัวรับเมื่อคุณไม่จำเป็นต้องใช้แล้ว หรือ บริบทนี้ใช้ไม่ได้แล้ว

    โปรดคำนึงถึงตำแหน่งที่คุณลงทะเบียนและยกเลิกการลงทะเบียนผู้รับ ตัวอย่างเช่น ถ้าคุณลงทะเบียนตัวรับใน onCreate(Bundle) โดยใช้บริบทของกิจกรรม ควรยกเลิกการลงทะเบียนใน onDestroy() เพื่อ เพื่อป้องกันไม่ให้ตัวรับสัญญาณรั่วไหลจากบริบทของกิจกรรม หากคุณลงทะเบียน รีซีฟเวอร์ใน onResume() คุณควร ยกเลิกการลงทะเบียนใน onPause() เพื่อป้องกัน การลงทะเบียนหลายครั้ง (หากไม่ต้องการรับประกาศ เมื่อหยุดชั่วคราว และลดการทำงานโดยไม่จำเป็นของระบบได้) ห้าม ยกเลิกการลงทะเบียนใน onSaveInstanceState(Bundle) เนื่องจากระบบจะไม่เรียกใช้การตั้งค่านี้หากผู้ใช้ย้ายกลับไปที่กลุ่มประวัติ

ผลกระทบต่อสถานะของกระบวนการ

ไม่ว่าจะเป็น BroadcastReceiver กำลังทำงานหรือไม่ส่งผลกระทบต่อกระบวนการที่มีอยู่ ซึ่งอาจเปลี่ยน จนระบบเกิดความเสียหาย กระบวนการเบื้องหน้าจะเรียกใช้เมธอด onReceive() ของผู้รับ ระบบจะเรียกใช้กระบวนการยกเว้นเมื่อหน่วยความจำมีหน่วยความจำใกล้เต็ม

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

ดังนั้น Broadcast Receiver ไม่ควรเริ่มต้นเทรดเบื้องหลังที่ทำงานเป็นเวลานาน ระบบจะหยุดกระบวนการได้ทุกเมื่อหลังจาก onReceive() เพื่อเรียกคืน ซึ่งเป็นการสิ้นสุดชุดข้อความที่สร้างขึ้น หากต้องการให้กระบวนการทำงานต่อไป ให้กำหนดเวลา JobService จากตัวรับโดยใช้ JobScheduler เพื่อให้ระบบรู้ว่ากระบวนการยังทำงานอยู่ ภาพรวมของงานในเบื้องหลังจะแสดงรายละเอียดเพิ่มเติม

กำลังส่งประกาศ

Android ให้แอปส่งประกาศ 3 วิธีดังนี้

  • sendOrderedBroadcast(Intent, String) วิธีส่งการออกอากาศไปยังเครื่องรับครั้งละ 1 เครื่อง เมื่อตัวรับแต่ละรายการทำงาน ในทางกลับกัน อาจถ่ายทอดผลลัพธ์ไปยังผู้รับรายต่อไป หรืออาจ ล้มเลิกการออกอากาศโดยสมบูรณ์เพื่อไม่ให้ส่งต่อให้กับการออกอากาศ รีซีฟเวอร์ ตัวรับคำสั่งซื้อที่ทำงานสามารถควบคุมด้วย android:แอตทริบิวต์ลำดับความสำคัญของตัวกรอง Intent ที่ตรงกัน รีซีฟเวอร์ที่มี ลำดับความสำคัญเดียวกัน จะถูกเรียกใช้ตามลำดับที่กำหนดเอง
  • เมธอด sendBroadcast(Intent) จะส่ง ออกอากาศไปยังผู้รับทั้งหมดตามลำดับที่ไม่ได้กำหนด วิธีนี้เรียกว่าวิธีการทั่วไป ประกาศ วิธีการนี้จะมีประสิทธิภาพมากกว่า แต่หมายความว่าผู้รับไม่สามารถอ่าน ผลลัพธ์จากตัวรับอื่น เผยแพร่ข้อมูลที่ได้รับจากการออกอากาศ หรือ ล้มเลิกการออกอากาศ

ข้อมูลโค้ดต่อไปนี้แสดงวิธีส่งการออกอากาศโดยการสร้าง Intent และการโทรหา sendBroadcast(Intent)

Kotlin

Intent().also { intent ->
    intent.setAction("com.example.broadcast.MY_NOTIFICATION")
    intent.putExtra("data", "Nothing to see here, move along.")
    sendBroadcast(intent)
}

Java

Intent intent = new Intent();
intent.setAction("com.example.broadcast.MY_NOTIFICATION");
intent.putExtra("data", "Nothing to see here, move along.");
sendBroadcast(intent);

ข้อความประกาศจะรวมอยู่ในออบเจ็กต์ Intent สตริงการดำเนินการของ Intent ต้องระบุไวยากรณ์ชื่อแพ็กเกจ Java ของแอปและ ระบุเหตุการณ์ที่ออกอากาศได้โดยไม่ซ้ำกัน คุณสามารถแนบข้อมูลเพิ่มเติม เป็น Intent ที่มี putExtra(String, Bundle) คุณยังจำกัดการออกอากาศให้เฉพาะชุดแอปในองค์กรเดียวกันได้โดย กำลังโทรหา setPackage(String) แบบ Intent

การจำกัดการออกอากาศด้วยสิทธิ์

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

การส่งโดยมีสิทธิ์

เมื่อคุณโทรหา sendBroadcast(Intent, String) หรือ sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle) คุณสามารถระบุ พารามิเตอร์สิทธิ์ เฉพาะผู้รับที่ส่งคำขออนุญาตนั้นกับ แท็ก ในไฟล์ Manifest (และได้สิทธิ์ อนุญาตหากเป็นอันตราย) สามารถรับการออกอากาศได้ ตัวอย่างเช่น พารามิเตอร์ โค้ดต่อไปนี้จะส่งประกาศ:

Kotlin

sendBroadcast(Intent(BluetoothDevice.ACTION_FOUND),
              Manifest.permission.BLUETOOTH_CONNECT)

Java

sendBroadcast(new Intent(BluetoothDevice.ACTION_FOUND),
              Manifest.permission.BLUETOOTH_CONNECT)

ในการรับการบรอดแคสต์ข้อความ แอปรับต้องขอสิทธิ์ดัง แสดงอยู่ด้านล่าง

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>

คุณสามารถระบุสิทธิ์สำหรับระบบที่มีอยู่แล้ว เช่น BLUETOOTH_CONNECT หรือกำหนดสิทธิ์ที่กำหนดเองด้วย องค์ประกอบ <permission> สำหรับ เกี่ยวกับสิทธิ์และความปลอดภัยโดยทั่วไป โปรดดูระบบ สิทธิ์

กำลังรับโดยมีสิทธิ์

หากคุณระบุพารามิเตอร์สิทธิ์เมื่อลงทะเบียน Broadcast Receiver (ที่มี registerReceiver(BroadcastReceiver, IntentFilter, String, Handler) หรือใน <receiver> ในแท็ก ) เฉพาะผู้ออกอากาศที่ขออนุญาต แท็ก <uses-permission> ในไฟล์ Manifest (และได้รับสิทธิ์ในภายหลังหากได้รับสิทธิ์ อันตราย) ส่ง Intent ไปยังผู้รับได้

ตัวอย่างเช่น สมมติว่าแอปที่คุณรับมีผู้รับที่ประกาศไฟล์ Manifest เป็น แสดงอยู่ด้านล่าง

<receiver android:name=".MyBroadcastReceiver"
          android:permission="android.permission.BLUETOOTH_CONNECT">
    <intent-filter>
        <action android:name="android.intent.action.ACTION_FOUND"/>
    </intent-filter>
</receiver>

หรือแอปรับมีตัวรับที่ลงทะเบียนตามบริบทดังที่แสดงด้านล่าง

Kotlin

var filter = IntentFilter(Intent.ACTION_FOUND)
registerReceiver(receiver, filter, Manifest.permission.BLUETOOTH_CONNECT, null )

Java

IntentFilter filter = new IntentFilter(Intent.ACTION_FOUND);
registerReceiver(receiver, filter, Manifest.permission.BLUETOOTH_CONNECT, null );

จากนั้นเพื่อที่จะส่งการกระจายข้อมูลไปยังผู้รับเหล่านั้นได้ แอปที่ส่งต้อง ขอสิทธิ์ดังที่แสดงด้านล่าง

<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>

ข้อควรพิจารณาและแนวทางปฏิบัติแนะนำด้านความปลอดภัย

ตัวอย่างข้อพิจารณาด้านความปลอดภัยและแนวทางปฏิบัติแนะนำในการส่งและ การรับการออกอากาศ:

  • หากมีหลายแอปได้ลงทะเบียนเพื่อรับการออกอากาศเดียวกันใน ไฟล์ Manifest อาจทำให้ระบบเปิดแอปพลิเคชันจำนวนมาก ส่งผลอย่างมากต่อทั้งประสิทธิภาพของอุปกรณ์และประสบการณ์ของผู้ใช้ วิธีหลีกเลี่ยง แนะนำให้ใช้การลงทะเบียนบริบทแทนการประกาศไฟล์ Manifest บางครั้งระบบ Android อาจบังคับให้ใช้ข้อความที่ลงทะเบียนตามบริบท รีซีฟเวอร์ ตัวอย่างเช่น ส่งการออกอากาศ CONNECTIVITY_ACTION แล้ว ให้แก่ผู้รับที่ลงทะเบียนตามบริบทเท่านั้น

  • ห้ามเผยแพร่ข้อมูลที่ละเอียดอ่อนโดยมีเจตนาโดยนัย แอปที่ลงทะเบียนเพื่อรับการแพร่สัญญาณสามารถอ่านข้อมูลได้ มี 3 วิธีในการควบคุมว่าใครจะสามารถรับการออกอากาศของคุณได้บ้าง

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

    • คุณสามารถระบุสิทธิ์ได้เมื่อลงทะเบียน Broadcast Receiver
    • สำหรับตัวรับที่ประกาศไฟล์ Manifest คุณสามารถตั้งค่า android:exported เป็น "เท็จ" ในไฟล์ Manifest ผู้รับไม่ได้รับ ประกาศจากแหล่งที่มาภายนอกแอป
  • เนมสเปซสำหรับการดำเนินการเผยแพร่เป็นแบบทั่วโลก ตรวจสอบให้แน่ใจว่าชื่อการดำเนินการ และสตริงอื่นๆ ถูกเขียนในเนมสเปซที่คุณเป็นเจ้าของ หรือคุณอาจ ขัดแย้งกับแอปอื่นๆ โดยไม่ตั้งใจ

  • เนื่องจากเมธอด onReceive(Context, Intent) ของผู้รับจะทำงานบน เทรดหลัก เทรดควรจะทำงานและแสดงผลอีกครั้งอย่างรวดเร็ว หากคุณจำเป็นต้องทำดังนี้ ทำงานที่ใช้เวลานาน ระวังอย่าสร้างชุดข้อความหรือเริ่ม บริการที่ทำงานอยู่เบื้องหลังเนื่องจากระบบสามารถสิ้นสุดกระบวนการทั้งหมดได้หลังจาก onReceive() คืนสินค้าแล้ว ดูข้อมูลเพิ่มเติมได้ที่ผลกระทบต่อกระบวนการ สถานะ ในการทำงานที่ใช้เวลานาน เรา แนะนำ:

    • กำลังโทรหา goAsync() ใน เมธอด onReceive() ของผู้รับและส่ง BroadcastReceiver.PendingResult ไปยังชุดข้อความเบื้องหลัง ซึ่งจะทำให้การออกอากาศยังคงดำเนินต่อไปหลังจากที่กลับมาจาก onReceive() แต่แม้ว่าจะใช้วิธีการนี้ แต่ระบบก็อาจคาดหวังให้คุณดำเนินการ ออกอากาศได้เร็วมาก (น้อยกว่า 10 วินาที) ทำให้คุณสามารถย้ายตำแหน่ง กับชุดข้อความอื่นเพื่อหลีกเลี่ยงไม่ให้ชุดข้อความหลักเกิดข้อผิดพลาด
    • การกำหนดเวลางานด้วย JobScheduler สำหรับข้อมูลเพิ่มเติม โปรดดูที่งานอัจฉริยะ การตั้งเวลา
  • อย่าเริ่มกิจกรรมจาก Broadcast Receiver เนื่องจากประสบการณ์ของผู้ใช้ น่าตกใจ โดยเฉพาะหากมีตัวรับมากกว่า 1 ตัว โปรดพิจารณา แสดงการแจ้งเตือน