Giao tiếp trong nền

Hướng dẫn này cung cấp thông tin tổng quan về cách hỗ trợ các trường hợp sử dụng chính để giao tiếp với thiết bị ngoại vi khi ứng dụng của bạn đang chạy ở chế độ nền:

Có nhiều tuỳ chọn để hỗ trợ từng trường hợp sử dụng này. Mỗi loại đều có những ưu điểm và nhược điểm có thể khiến loại đó phù hợp hơn hoặc ít phù hợp hơn với nhu cầu cụ thể của bạn.

Sơ đồ sau đây cho thấy một bản xem xét đơn giản về hướng dẫn trên trang này:

Tìm một thiết bị

Trước tiên, ứng dụng của bạn cần tìm một thiết bị để kết nối. Để tìm một thiết bị BLE, bạn có thể sử dụng một trong các API sau:

Trong chế độ nền

Không có giới hạn nào về việc sử dụng một trong hai API này khi ứng dụng không hiển thị, nhưng cả hai đều cần quy trình ứng dụng của bạn hoạt động. Nếu quy trình ứng dụng không chạy, bạn có thể sử dụng các giải pháp sau:

  • Đối với BluetoothLeScanner: Gọi startScan() bằng đối tượng PendingIntent thay vì đối tượng ScanCallback để nhận thông báo khi quét được một thiết bị khớp với bộ lọc của bạn. (Mẫu)
  • Đối với CompanionDeviceManager: Làm theo hướng dẫn trong phần Giữ cho ứng dụng đồng hành luôn thức để đánh thức ứng dụng và giữ cho ứng dụng luôn thức trong khi thiết bị đã liên kết trước đó ở trong phạm vi. (Mẫu)

Kết nối với thiết bị

Để kết nối với một thiết bị sau khi tìm thấy thiết bị đó, bạn cần lấy một thực thể BluetoothDevice cho thiết bị từ một trong các nguồn sau:

Sau khi có một thực thể BluetoothDevice, bạn có thể bắt đầu yêu cầu kết nối với thiết bị tương ứng bằng cách gọi một trong các phương thức connectGatt(). Giá trị mà bạn truyền vào boolean autoConnect xác định ứng dụng GATT sử dụng chế độ kết nối nào trong hai chế độ sau:

  • Kết nối trực tiếp (autoconnect = false): Thử kết nối trực tiếp với thiết bị ngoại vi và không thành công nếu không có thiết bị. Trong trường hợp ngắt kết nối, ứng dụng GATT sẽ không tự động cố gắng kết nối lại.
  • Tự động kết nối (autoconnect = true): Thử tự động kết nối với thiết bị ngoại vi bất cứ khi nào có thể. Trong trường hợp thiết bị ngoại vi ngắt kết nối do thiết bị ngoại vi nằm ngoài phạm vi hoặc do thiết bị ngoại vi bị hỏng, ứng dụng GATT sẽ tự động cố gắng kết nối lại khi thiết bị ngoại vi có sẵn.

Trong chế độ nền

Không có quy định hạn chế nào về việc kết nối với thiết bị khi ứng dụng đang chạy ở chế độ nền, mặc dù kết nối sẽ bị đóng nếu quy trình của bạn bị chấm dứt. Ngoài ra, có các hạn chế về việc bắt đầu hoạt động (trong Android 10 trở lên) hoặc dịch vụ trên nền trước (trong Android 12 trở lên) từ chế độ nền.

Do đó, để thực hiện kết nối trong khi ở chế độ nền, ứng dụng có thể sử dụng các giải pháp sau:

Duy trì kết nối với thiết bị

Lý tưởng nhất là các ứng dụng chỉ duy trì kết nối với thiết bị ngoại vi khi cần thiết và ngắt kết nối sau khi hoàn tất tác vụ. Tuy nhiên, có hai trường hợp mà ứng dụng có thể cần duy trì kết nối vô thời hạn:

Trong cả hai trường hợp, bạn có thể chọn trong các tuỳ chọn sau:

Trong khi chuyển đổi giữa các ứng dụng

Việc tìm thiết bị, kết nối với thiết bị và chuyển dữ liệu sẽ tốn nhiều thời gian và tài nguyên. Để tránh mất kết nối và phải thực hiện toàn bộ quy trình mỗi khi người dùng chuyển đổi giữa các ứng dụng hoặc thực hiện các tác vụ đồng thời, bạn nên duy trì kết nối cho đến khi thao tác hoàn tất. Bạn có thể sử dụng dịch vụ trên nền trước với loại connectedDevice hoặc API hiện diện của thiết bị đồng hành.

Trong khi nghe thông báo về thiết bị ngoại vi

Để nghe thông báo về thiết bị ngoại vi, ứng dụng phải gọi setCharacteristicNotification(), nghe lệnh gọi lại bằng onCharacteristicChanged() và duy trì kết nối. Đối với hầu hết ứng dụng, tốt nhất bạn nên hỗ trợ trường hợp sử dụng này bằng CompanionDeviceService vì ứng dụng có thể cần tiếp tục nghe trong thời gian dài. Tuy nhiên, bạn cũng có thể sử dụng dịch vụ trên nền trước.

Trong cả hai trường hợp, bạn có thể kết nối lại sau khi một quy trình bị chấm dứt bằng cách làm theo hướng dẫn trong phần Kết nối với thiết bị.