本指南將概略說明如何在應用程式於背景執行時,支援與周邊裝置通訊的重要用途:
我們提供多種選項,可支援上述各項用途。每個選項都有優缺點,可能較適合或不太適合您的特定需求。
下圖簡要呈現本頁面指引的內容:
尋找裝置
首先,應用程式需要找到要連結的裝置。如要尋找 BLE 裝置,您可以使用下列任一 API:
BluetoothLeScanner
,如「尋找 BLE 裝置」一節所述。(範例)。CompanionDeviceManager
,如「隨附裝置配對」一節所述。(範例)。
在背景中
在應用程式不可見時,使用這兩種 API 並無任何限制,但兩者都需要應用程式程序處於運作狀態。如果應用程式程序未執行,您可以使用下列因應措施:
- 針對
BluetoothLeScanner
:請使用PendingIntent
物件,而非ScanCallback
物件,呼叫startScan()
,以便在掃描符合篩選條件的裝置時收到通知。(範例)。 - 針對
CompanionDeviceManager
:請按照「讓隨附應用程式保持運作」中的指示,在先前已連結的裝置在範圍內時喚醒應用程式並讓其保持運作。(範例)。
連結裝置
找到裝置後,如要連線,您必須從下列任一來源取得裝置的 BluetoothDevice
例項:
- 上一節所述的
BluetoothLeScanner
掃描結果。 - 從
BluetoothAdapter.getBondedDevices()
擷取的已綁定裝置清單。 - 使用
BluetoothAdapter.getRemoteLeDevice()
的BluetoothAdapter
快取。
取得 BluetoothDevice
例項後,您可以呼叫其中一個 connectGatt()
方法,啟動對應裝置的連線要求。您傳遞至 autoConnect
布林值的值,會定義 GATT 用戶端會使用下列兩種連線模式中的哪一種:
- 直接連接 (
autoconnect = false
):嘗試直接連接至周邊裝置,如果裝置無法使用,則會失敗。在連線中斷的情況下,GATT 用戶端不會自動嘗試重新連線。 - 自動連線 (
autoconnect = true
):嘗試在可用時自動連線至周邊裝置。如果是周邊裝置中斷連線或超出範圍,GATT 用戶端會在周邊裝置可用時自動嘗試重新連線。
在背景中
應用程式處於背景執行時,連線至裝置不會受到任何限制,但如果程序遭到終止,連線就會關閉。此外,從背景啟動活動 (在 Android 10 以上版本) 或前景服務 (在 Android 12 以上版本) 也設有限制。
因此,如要在背景執行連線作業,應用程式可以使用下列解決方案:
- 使用 WorkManager 連線至裝置。
- 您可以設定
PeriodicWorkRequest
或OneTimeWorkRequest
來執行定義的動作,但可能會受到應用程式限制。 - 此外,您還可以利用 WorkManager 的其他功能,例如工作限制、急件工作、重試政策等。
- 如果需要盡可能保持連線狀態,才能執行資料同步或從周邊裝置進行輪詢等工作,您就必須按照「支援長時間執行的 worker」一文中的指示啟動前景服務。不過,前景服務啟動限制會從 Android 12 開始實施。
- 您可以設定
- 啟動
connectedDevice
類型的前景服務。- 如果需要盡可能保持連線狀態,才能執行資料同步或從周邊裝置進行輪詢等工作,您就必須按照「支援長時間執行的 worker」一文中的指示啟動前景服務。不過,前景服務啟動限制會從 Android 12 開始實施。
- 如「尋找裝置」一文所述,請使用
PendingIntent
物件呼叫startScan()
,以便在裝置出現時喚醒程序。外接裝置必須進行廣告。- 建議您啟動 worker 和工作。這可能會遭系統中斷,因此只能支援短時間的通訊。
- 在 Android 12 以下版本中,您可以直接從
PendingIntent
物件啟動前景服務。
- 請使用
CompanionDeviceService
和REQUEST_COMPANION_RUN_IN_BACKGROUND
或REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
權限,從背景啟動服務。
保持連線
理想情況下,應用程式應只在必要時與周邊裝置保持連線,並在工作完成後中斷連線。不過,在以下兩種情況下,應用程式可能需要無限期維持連線:
無論是哪種情況,您都可以使用下列選項:
- 使用
CompanionDeviceService
搭配REQUEST_COMPANION_RUN_IN_BACKGROUND
權限和CompanionDeviceManager.startObservingDevicePresence()
方法。 - 在應用程式處於前景 (或豁免情況) 時,使用
connectedDevice
前景類型啟動前景服務。
切換應用程式時
尋找裝置、連線及傳輸資料的作業耗時且耗用大量資源。為避免連線中斷,並在使用者每次切換應用程式或同時執行多項工作時,必須執行完整程序,因此您應在作業完成前保持連線。您可以使用 connectedDevice
類型的前景服務,或隨附裝置狀態 API。
聽取周邊裝置通知時
如要監聽周邊裝置通知,應用程式必須呼叫 setCharacteristicNotification()
,使用 onCharacteristicChanged()
監聽回呼,並維持連線。對於大多數應用程式,最好使用 CompanionDeviceService
支援此用途,因為應用程式可能需要長時間持續聆聽。不過,您也可以使用前景服務。
無論是哪種情況,您都可以按照「連線至裝置」一節中的操作說明,在程序終止後重新連線。