คู่มือนี้จะแสดงภาพรวมของวิธีรองรับกรณีการใช้งานหลักในการสื่อสารกับอุปกรณ์ต่อพ่วงเมื่อแอปทำงานอยู่เบื้องหลัง
กรณีการใช้งานแต่ละรายการมีตัวเลือกหลายรายการที่รองรับ แต่ละวิธีมีทั้งข้อดีและข้อเสียที่อาจทําให้เหมาะกับความต้องการเฉพาะของคุณมากหรือน้อย
แผนภาพต่อไปนี้แสดงมุมมองแบบง่ายของคําแนะนําในหน้านี้
ค้นหาอุปกรณ์
ก่อนอื่น แอปต้องค้นหาอุปกรณ์ที่จะเชื่อมต่อ หากต้องการค้นหาอุปกรณ์ BLE คุณสามารถใช้ API ต่อไปนี้
BluetoothLeScanner
ตามที่อธิบายไว้ในค้นหาอุปกรณ์ BLE (ตัวอย่าง)CompanionDeviceManager
ตามที่อธิบายไว้ในการจับคู่อุปกรณ์เสริม (ตัวอย่าง)
ในเบื้องหลัง
ไม่มีข้อจำกัดในการใช้ API เหล่านี้ขณะที่แอปไม่แสดง แต่ทั้ง 2 API จำเป็นต้องมีกระบวนการของแอปทำงานอยู่ หากกระบวนการของแอปไม่ทำงาน คุณสามารถใช้วิธีแก้ปัญหาชั่วคราวต่อไปนี้
- สำหรับ
BluetoothLeScanner
: โทรหาstartScan()
ด้วยออบเจ็กต์PendingIntent
แทนออบเจ็กต์ScanCallback
เพื่อรับการแจ้งเตือนเมื่อสแกนพบอุปกรณ์ที่ตรงกับตัวกรอง (ตัวอย่าง) - สำหรับ
CompanionDeviceManager
: ทำตามคำแนะนำในทำให้แอปที่ใช้ร่วมกันทำงานอยู่เสมอเพื่อปลุกแอปและทำให้แอปทำงานอยู่เสมอขณะที่อุปกรณ์ที่เชื่อมโยงไว้ก่อนหน้านี้อยู่ในช่วงสัญญาณ (ตัวอย่าง)
เชื่อมต่อกับอุปกรณ์
หากต้องการเชื่อมต่อกับอุปกรณ์หลังจากที่พบแล้ว คุณจะต้องรับอินสแตนซ์ BluetoothDevice
ของอุปกรณ์จากแหล่งที่มาแหล่งใดแหล่งหนึ่งต่อไปนี้
- ผลลัพธ์การสแกน
BluetoothLeScanner
ตามที่อธิบายไว้ในส่วนก่อนหน้า - รายการอุปกรณ์ที่ผูกไว้ซึ่งดึงมาจาก
BluetoothAdapter.getBondedDevices()
- แคช
BluetoothAdapter
โดยใช้BluetoothAdapter.getRemoteLeDevice()
หลังจากมีอินสแตนซ์ BluetoothDevice
แล้ว คุณสามารถเริ่มคําขอเชื่อมต่อกับอุปกรณ์ที่เกี่ยวข้องได้โดยเรียกใช้เมธอดใดเมธอดหนึ่งจาก connectGatt()
ค่าที่คุณส่งไปยังบูลีน autoConnect
จะกำหนดว่าไคลเอ็นต์ GATT ใช้โหมดการเชื่อมต่อใดใน 2 โหมดต่อไปนี้
- เชื่อมต่อโดยตรง (
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()
, ฟังการเรียกกลับโดยใช้ onCharacteristicChanged()
และเชื่อมต่อไว้ สําหรับแอปส่วนใหญ่ การสนับสนุน Use Case นี้ด้วย CompanionDeviceService
จะเป็นทางเลือกที่ดีที่สุด เนื่องจากแอปอาจต้องฟังเสียงอย่างต่อเนื่องเป็นเวลานาน แต่คุณก็ใช้บริการที่ใช้งานอยู่ได้เช่นกัน
ไม่ว่าในกรณีใด คุณจะเชื่อมต่ออีกครั้งได้หลังจากกระบวนการสิ้นสุดลงโดยทำตามวิธีการในส่วนเชื่อมต่อกับอุปกรณ์