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 lựa chọn để hỗ trợ từng trường hợp sử dụng này. Mỗi phương pháp đều có những ưu và nhược điểm, có thể phù hợp hoặc không phù hợp với nhu cầu cụ thể của bạn.
Sơ đồ sau đây trình bày thông tin hướng dẫn trên trang này một cách đơn giản:

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 thiết bị BLE, bạn có thể sử dụng một trong các API sau:
BluetoothLeScannernhư mô tả trong phần Tìm thiết bị BLE. (Đoạn nhạc)CompanionDeviceManagernhư mô tả trong phần Ghép nối thiết bị đồng hành. (Đoạn nhạc)
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 API đề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ọistartScan()bằng đối tượngPendingIntentthay vì đối tượngScanCallbackđể nhận thông báo khi một thiết bị khớp với bộ lọc của bạn được quét. (Đoạn nhạc) - Đối với
CompanionDeviceManager: Hãy làm theo hướng dẫn trong phần Duy trì trạng thái hoạt động cho ứng dụng đồng hành để đánh thức ứng dụng và duy trì trạng thái hoạt động cho ứng dụng trong khi thiết bị được liên kết trước đó nằm trong phạm vi. (Đoạn nhạc)
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:
- Kết quả quét
BluetoothLeScannernhư mô tả trong phần trước. - Danh sách thiết bị đã liên kết được truy xuất từ
BluetoothAdapter.getBondedDevices(). - Bộ nhớ đệm
BluetoothAdapter, sử dụngBluetoothAdapter.getRemoteLeDevice().
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 chế độ nào trong hai chế độ kết nối sau đây mà ứng dụng GATT sử dụng:
- Kết nối trực tiếp (
autoconnect = false): Cố gắng 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 thiết bị không có sẵn. Trong trường hợp bị ngắt kết nối, ứng dụng GATT sẽ không tự động kết nối lại. - Tự động kết nối (
autoconnect = true): Cố gắng 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 ngắt kết nối do thiết bị ngoại vi khởi tạo hoặc do thiết bị ngoại vi nằm ngoài phạm vi, ứ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 một 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ị tắt. Ngoài ra, còn có các quy định 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 đó, để kết nối khi ở chế độ nền, ứng dụng có thể sử dụng các giải pháp sau:
- Sử dụng WorkManager để kết nối với thiết bị của bạn.
- Bạn có thể đặt
PeriodicWorkRequesthoặcOneTimeWorkRequestđể thực hiện một hành động đã xác định, mặc dù các quy định hạn chế về ứng dụng có thể áp dụng. - Ngoài ra, bạn có thể hưởng lợi từ các tính năng của WorkManager như các quy tắc ràng buộc về công việc, công việc ưu tiên, chính sách thử lại, v.v.
- Nếu cần duy trì kết nối càng lâu càng tốt để thực hiện một tác vụ, chẳng hạn như đồng bộ hoá dữ liệu hoặc thăm dò ý kiến từ các thiết bị ngoại vi, thì bạn cần bắt đầu một dịch vụ trên nền trước theo hướng dẫn trong phần Hỗ trợ cho worker chạy trong thời gian dài. Tuy nhiên, các hạn chế khi khởi động dịch vụ trên nền trước sẽ áp dụng từ Android 12.
- Bạn có thể đặt
- Bắt đầu một dịch vụ nền trước thuộc loại
connectedDevice.- Nếu cần duy trì kết nối càng lâu càng tốt để thực hiện một tác vụ, chẳng hạn như đồng bộ hoá dữ liệu hoặc thăm dò ý kiến từ các thiết bị ngoại vi, thì bạn cần bắt đầu một dịch vụ nền trước theo hướng dẫn trong phần Hỗ trợ cho worker chạy trong thời gian dài. Tuy nhiên, các hạn chế khi khởi động dịch vụ trên nền trước sẽ áp dụng từ Android 12.
- Gọi
startScan()bằng đối tượngPendingIntentnhư mô tả trong phần Tìm thiết bị để đánh thức quy trình khi có thiết bị. Thiết bị ngoại vi phải đang quảng cáo.- Bạn nên bắt đầu một Worker và một Job. Hệ thống có thể làm gián đoạn quá trình này, do đó, quá trình này chỉ có thể hỗ trợ hoạt động giao tiếp trong thời gian ngắn.
- Trong các phiên bản thấp hơn Android 12, bạn có thể bắt đầu một dịch vụ trên nền trước ngay từ đối tượng
PendingIntent.
- Sử dụng
CompanionDeviceServicevà một trong hai quyềnREQUEST_COMPANION_RUN_IN_BACKGROUNDhoặcREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDđể bắt đầu dịch vụ từ chế độ nền.
Duy trì kết nối với thiết bị
Tốt nhất là các ứng dụng chỉ nên duy trì kết nối với thiết bị ngoại vi trong thời gian 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 phương án sau đây:
- Sử dụng
CompanionDeviceServicevới quyềnREQUEST_COMPANION_RUN_IN_BACKGROUNDvà phương thứcCompanionDeviceManager.startObservingDevicePresence(). - Bắt đầu một dịch vụ nền trước trong khi ứng dụng đang chạy trên nền trước (hoặc thuộc một trong các trường hợp miễn trừ) có loại dịch vụ nền trước là
connectedDevice.
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ụ nền trước thuộc loại connectedDevice hoặc API sự 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 của 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 các ứng dụng, tốt nhất là bạn nên hỗ trợ trường hợp sử dụng này
bằng CompanionDeviceService vì ứng dụng có thể sẽ 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ụ nền trước.
Trong cả hai trường hợp, bạn có thể kết nối lại sau khi quá 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ị.