แอป 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 ให้ทำตามขั้นตอนต่อไปนี้
ระบุ
<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 จะระบุการดำเนินการออกอากาศที่ผู้รับสมัครใช้บริการ
คลาสย่อย
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.9.0 ขึ้นไป ไลบรารี AndroidX Core ดังนี้
ดึงดูด
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-alpha02" }
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-alpha02") }
สร้างอินสแตนซ์ของ
BroadcastReceiver
:Kotlin
val br: BroadcastReceiver = MyBroadcastReceiver()
Java
BroadcastReceiver br = new MyBroadcastReceiver();
สร้างอินสแตนซ์ของ
IntentFilter
:Kotlin
val filter = IntentFilter(APP_SPECIFIC_BROADCAST)
Java
IntentFilter filter = new IntentFilter(APP_SPECIFIC_BROADCAST);
เลือกว่าจะส่งออก 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; }
ลงทะเบียนผู้รับด้วยการโทร
registerReceiver()
:Kotlin
ContextCompat.registerReceiver(context, br, filter, receiverFlags)
Java
ContextCompat.registerReceiver(context, br, filter, receiverFlags);
หากต้องการหยุดรับการประกาศ โปรดโทรหา
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)
คุณสามารถระบุ
พารามิเตอร์สิทธิ์ เฉพาะผู้รับที่ส่งคำขออนุญาตนั้นกับ
แท็ก
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 ตัว โปรดพิจารณา แสดงการแจ้งเตือน