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 đ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 giải pháp đều có những lợi ích và hạn chế có thể khiến quảng cáo phù hợp hơn hoặc không phù hợp với nhu cầu cụ thể của bạn.
Sơ đồ dưới đây cho thấy hướng dẫn đơn giả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 thiết bị BLE, bạn có thể dùng một trong các API sau:
BluetoothLeScanner
như mô tả trong phần Tìm thiết bị BLE. (Mẫu)CompanionDeviceManager
như mô tả trong phần Ghép nối thiết bị đồng hành. (Mẫu)
Trong chế độ nền
Không có giới hạn 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 này đề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ượngPendingIntent
thay 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. (Mẫu) - Đối với
CompanionDeviceManager
: Làm theo hướng dẫn trong bài viết Giữ cho các ứng dụng đồng hành bật lên để đánh thức ứng dụng và giữ cho ứng dụng luôn bật trong khi một thiết bị đã liên kết trước đó vẫn nằm 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 thực thể BluetoothDevice
cho thiết bị đó từ một trong các nguồn sau:
- Kết quả quét
BluetoothLeScanner
như 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ó 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 hai chế độ kết nối nào 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à sẽ không kết nối được nếu không có thiết bị. 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ó sẵn. Trong trường hợp ngắt kết nối do thiết bị ngoại vi gây ra 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 có thiết bị ngoại vi.
Trong chế độ nền
Không có hạn chế nào đối với việc kết nối với một thiết bị trong khi ứng dụng chạy ở chế độ nền, mặc dù kết nối sẽ bị đóng nếu quá trình bị dừng. Ngoài ra, còn có quy định hạn chế khi khởi động 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) ở chế độ nền.
Do đó, để thực hiện kết nối trong khi ở chế độ nền, các ứ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
PeriodicWorkRequest
hoặcOneTimeWorkRequest
để thực hiện một thao tác đã xác định, mặc dù có thể áp dụng các hạn chế đối với ứng 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 đối với công việc, công việc ưu tiên, chính sách thử lại và nhiều tính năng khác.
- Nếu cần duy trì kết nối trong thời gian dài nhất có thể để 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ừ thiết bị ngoại vi, thì bạn cần bắt đầu dịch vụ trên nền trước theo hướng dẫn trong phần Hỗ trợ trình thực thi chạy trong thời gian dài. Tuy nhiên, các hạn chế khi chạy dịch vụ trên nền trước sẽ áp dụng kể từ Android 12.
- Bạn có thể đặt
- Bắt đầu một dịch vụ trên nền trước thuộc kiểu
connectedDevice
.- Nếu cần duy trì kết nối trong thời gian dài nhất có thể để 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ừ thiết bị ngoại vi, thì bạn cần bắt đầu dịch vụ trên nền trước theo hướng dẫn trong phần Hỗ trợ trình thực thi chạy trong thời gian dài. Tuy nhiên, các hạn chế khi chạy dịch vụ trên nền trước sẽ áp dụng kể từ Android 12.
- Gọi
startScan()
bằng đối tượngPendingIntent
như mô tả trong phần Tìm thiết bị để đánh thức quy trình của bạn 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 Công việc. Quá trình này có thể bị hệ thống làm gián đoạn, do đó 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 dịch vụ trên nền trước ngay từ đối tượng
PendingIntent
.
- Sử dụng
CompanionDeviceService
và một trong các quyềnREQUEST_COMPANION_RUN_IN_BACKGROUND
hoặcREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
để bắt đầu dịch vụ ở chế độ nền.
Duy trì kết nối với một 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 khi cần thiết và ngắt kết nối sau khi hoàn thành nhiệm 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 các tuỳ chọn sau:
- Sử dụng
CompanionDeviceService
với quyềnREQUEST_COMPANION_RUN_IN_BACKGROUND
và phương thứcCompanionDeviceManager.startObservingDevicePresence()
. - Bắt đầu dịch vụ trên nền trước khi ứng dụng đang chạy trên nền trước (hoặc trong một trong các quy tắc miễn trừ) bằng loại
connectedDevice
trên nền trước.
Trong khi chuyển đổi giữa các ứng dụng
Việc tìm một thiết bị, kết nối với thiết bị đó và chuyển dữ liệu rất tốn thời gian và tốn nhiều tài nguyên. Để tránh mất kết nối và phải thực hiện toàn bộ quá 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 thao tác đồng thời, bạn nên duy trì kết nối cho đến khi thao tác kết thúc. 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 thiết bị đồng hành.
Trong khi nghe thông báo của thiết bị ngoại vi
Để theo dõi các thông báo của thiết bị ngoại vi, ứng dụng phải gọi setCharacteristicNotification()
, theo dõi các 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 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ẽ phải 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 quá trình 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ị.