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

ค้นหาอุปกรณ์
ก่อนอื่น แอปของคุณต้องค้นหาอุปกรณ์ที่จะเชื่อมต่อ หากต้องการค้นหาอุปกรณ์ BLE คุณสามารถใช้ API อย่างใดอย่างหนึ่งต่อไปนี้
BluetoothLeScannerตามที่อธิบายไว้ในค้นหาอุปกรณ์ BLE (ตัวอย่าง)CompanionDeviceManagerตามที่อธิบายไว้ในการจับคู่อุปกรณ์ที่ใช้ร่วมกัน (ตัวอย่าง)
ในเบื้องหลัง
ไม่มีข้อจำกัดในการใช้ API เหล่านี้ขณะที่แอปไม่ปรากฏ แต่ทั้ง 2 อย่างจำเป็นต้องให้กระบวนการของแอปทำงานอยู่ หากกระบวนการของแอปไม่ทำงาน คุณสามารถใช้วิธีแก้ปัญหาต่อไปนี้
- สำหรับ
BluetoothLeScanner: ให้เรียกใช้startScan()ด้วยออบเจ็กต์PendingIntentแทน ออบเจ็กต์ScanCallbackเพื่อ รับการแจ้งเตือนเมื่อมีการสแกนอุปกรณ์ที่ตรงกับตัวกรองของคุณ (ตัวอย่าง) - สำหรับ
CompanionDeviceManager: ทำตามคำแนะนำในหัวข้อปลุกแอปที่ใช้ร่วมกันให้ทำงานเพื่อปลุกแอปและทำให้แอปทำงานต่อไปขณะที่อุปกรณ์ที่เชื่อมโยงก่อนหน้านี้อยู่ในระยะสัญญาณ (ตัวอย่าง)
เชื่อมต่อกับอุปกรณ์
หากต้องการเชื่อมต่อกับอุปกรณ์หลังจากที่พบแล้ว คุณต้องรับอินสแตนซ์ BluetoothDevice สำหรับอุปกรณ์จากแหล่งที่มาอย่างใดอย่างหนึ่งต่อไปนี้
- ผลการสแกน
BluetoothLeScannerตามที่อธิบายไว้ในส่วนก่อนหน้า - รายการอุปกรณ์ที่เชื่อมโยงซึ่งดึงมาจาก
BluetoothAdapter.getBondedDevices() - แคช
BluetoothAdapterโดยใช้BluetoothAdapter.getRemoteLeDevice()
หลังจากมีอินสแตนซ์ BluetoothDevice แล้ว คุณจะเริ่มคำขอเชื่อมต่อกับอุปกรณ์ที่เกี่ยวข้องได้โดยเรียกใช้เมธอด connectGatt() เมธอดใดเมธอดหนึ่ง ค่าที่คุณส่งไปยังบูลีน autoConnect จะกำหนดว่าไคลเอ็นต์ GATT จะใช้โหมดการเชื่อมต่อใดต่อไปนี้
- เชื่อมต่อโดยตรง (
autoconnect = false): พยายามเชื่อมต่อกับอุปกรณ์ต่อพ่วงโดยตรง และจะดำเนินการไม่สำเร็จหากอุปกรณ์ไม่พร้อมใช้งาน ในกรณีที่ขาดการเชื่อมต่อ ไคลเอ็นต์ GATT จะไม่พยายามเชื่อมต่อใหม่โดยอัตโนมัติ - เชื่อมต่ออัตโนมัติ (
autoconnect = true): พยายามเชื่อมต่อกับอุปกรณ์ต่อพ่วงโดยอัตโนมัติเมื่อพร้อมใช้งาน ในกรณีที่อุปกรณ์ต่อพ่วงเป็นฝ่ายตัดการเชื่อมต่อหรือเนื่องจากอุปกรณ์ต่อพ่วงอยู่นอกระยะสัญญาณ ไคลเอ็นต์ GATT จะพยายามเชื่อมต่อใหม่โดยอัตโนมัติเมื่ออุปกรณ์ต่อพ่วงพร้อมใช้งาน
ในเบื้องหลัง
ไม่มีข้อจำกัดในการเชื่อมต่อกับอุปกรณ์ขณะที่แอปทำงานอยู่เบื้องหลัง แต่การเชื่อมต่อจะปิดลงหากกระบวนการของคุณถูกหยุดทำงาน นอกจากนี้ยังมีข้อจำกัดในการเริ่มกิจกรรม (ใน Android 10 ขึ้นไป) หรือบริการที่ทำงานอยู่เบื้องหน้า (ใน Android 12 ขึ้นไป) จากเบื้องหลัง
ดังนั้น หากต้องการเชื่อมต่อขณะทำงานอยู่เบื้องหลัง แอปสามารถใช้โซลูชันต่อไปนี้
- ใช้ WorkManager เพื่อเชื่อมต่อกับอุปกรณ์ของคุณ
- คุณสามารถตั้งค่า
PeriodicWorkRequestหรือOneTimeWorkRequestเพื่อดำเนินการที่กำหนดไว้ได้ แม้ว่าอาจมีข้อจำกัดของแอปก็ตาม - นอกจากนี้ คุณยังใช้ประโยชน์จากฟีเจอร์ของ WorkManager ได้ เช่น ข้อจำกัดของงาน งานด่วน นโยบายการลองใหม่ และอื่นๆ
- หากจำเป็นต้องคงการเชื่อมต่อไว้ให้นานที่สุดเพื่อทำงาน เช่น การซิงค์ข้อมูลหรือการโพลจากอุปกรณ์ต่อพ่วง คุณต้องเริ่มบริการที่ทำงานอยู่เบื้องหน้าตามคำแนะนำในหัวข้อการรองรับผู้ปฏิบัติงานที่ทำงานเป็นเวลานาน อย่างไรก็ตาม การจำกัดการเปิดบริการที่ทำงานอยู่เบื้องหน้าจะมีผลตั้งแต่ Android 12 เป็นต้นไป
- คุณสามารถตั้งค่า
- เริ่มบริการที่ทำงานอยู่เบื้องหน้าด้วยประเภท
connectedDevice- หากจำเป็นต้องคงการเชื่อมต่อไว้ให้นานที่สุดเพื่อทำงาน เช่น การซิงค์ข้อมูลหรือการโพลจากอุปกรณ์ต่อพ่วง คุณต้องเริ่มบริการที่ทำงานอยู่เบื้องหน้าตามคำแนะนำในหัวข้อการรองรับผู้ปฏิบัติงานที่ทำงานเป็นเวลานาน อย่างไรก็ตาม การจำกัดการเปิดบริการที่ทำงานอยู่เบื้องหน้าจะมีผลตั้งแต่ Android 12 เป็นต้นไป
- เรียกใช้
startScan()ด้วยออบเจ็กต์PendingIntentตามที่อธิบายไว้ในค้นหาอุปกรณ์เพื่อปลุกกระบวนการเมื่อมีอุปกรณ์อยู่ อุปกรณ์ต่อพ่วงต้องกระจายข้อมูลอยู่- เราขอแนะนำให้คุณเริ่ม Worker และ Job ระบบอาจขัดจังหวะการสื่อสารนี้ จึงรองรับการสื่อสารในระยะเวลาสั้นๆ เท่านั้น
- ในเวอร์ชันที่ต่ำกว่า Android 12 คุณสามารถเริ่มบริการที่ทำงานอยู่เบื้องหน้าได้โดยตรงจากออบเจ็กต์
PendingIntent
- ใช้สิทธิ์
CompanionDeviceServiceและสิทธิ์REQUEST_COMPANION_RUN_IN_BACKGROUNDหรือREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDเพื่อเริ่มบริการจากเบื้องหลัง
เชื่อมต่อกับอุปกรณ์อยู่เสมอ
ตามหลักการแล้ว แอปควรรักษาการเชื่อมต่อกับอุปกรณ์ต่อพ่วงไว้ตราบเท่าที่จำเป็นเท่านั้น และยกเลิกการเชื่อมต่อเมื่อทำงานเสร็จแล้ว อย่างไรก็ตาม มี 2 กรณีที่แอปอาจต้องคงการเชื่อมต่อไว้ตลอดไป ดังนี้
ในทั้ง 2 กรณี คุณจะมีตัวเลือกต่อไปนี้
- ใช้
CompanionDeviceServiceกับสิทธิ์REQUEST_COMPANION_RUN_IN_BACKGROUNDและเมธอดCompanionDeviceManager.startObservingDevicePresence() - เริ่มบริการที่ทำงานอยู่เบื้องหน้าขณะที่แอปทำงานอยู่เบื้องหน้า (หรืออยู่ภายใต้ข้อยกเว้นข้อใดข้อหนึ่ง) โดยใช้ประเภทบริการที่ทำงานอยู่เบื้องหน้าเป็น
connectedDevice
ขณะสลับไปมาระหว่างแอป
การค้นหาอุปกรณ์ การเชื่อมต่อ และการโอนข้อมูลต้องใช้เวลาและทรัพยากรมาก เพื่อหลีกเลี่ยงการสูญเสียการเชื่อมต่อและต้องดำเนินการตามกระบวนการทั้งหมดทุกครั้งที่ผู้ใช้สลับไปมาระหว่างแอปหรือทำงานพร้อมกัน คุณควรคงการเชื่อมต่อไว้จนกว่าการดำเนินการจะเสร็จสิ้น คุณสามารถใช้บริการที่ทำงานอยู่เบื้องหน้าซึ่งมีประเภท connectedDevice หรือ API การแสดงตนของอุปกรณ์ที่ใช้ร่วมกันก็ได้
ขณะฟังการแจ้งเตือนเกี่ยวกับอุปกรณ์ต่อพ่วง
หากต้องการฟังการแจ้งเตือนของอุปกรณ์ต่อพ่วง แอปต้องเรียกใช้ setCharacteristicNotification() ฟัง Callback โดยใช้ onCharacteristicChanged() และคงการเชื่อมต่อไว้ สำหรับแอปส่วนใหญ่ วิธีที่ดีที่สุดในการรองรับ Use Case นี้คือใช้ CompanionDeviceService เนื่องจากแอปอาจต้องฟังเป็นเวลานาน อย่างไรก็ตาม คุณยังใช้บริการที่ทำงานอยู่เบื้องหน้าได้ด้วย
ไม่ว่าในกรณีใด คุณสามารถเชื่อมต่ออีกครั้งหลังจากกระบวนการที่สิ้นสุดลงโดยทำตามวิธีการในส่วนเชื่อมต่อกับอุปกรณ์