本指南概略說明如何支援主要用途,以便在應用程式於背景執行時,與周邊裝置通訊:
有多種選項可支援上述各項用途。每種方法各有優缺點,可能適合或不適合您的特定需求。
下圖簡要說明本頁的指引:

尋找裝置
首先,應用程式需要找到要連線的裝置。如要尋找 BLE 裝置,可以使用下列任一 API:
BluetoothLeScanner,如「尋找 BLE 裝置」所述。(範例)CompanionDeviceManager如「配對裝置配對」一節所述。(範例)
在背景中
在應用程式不可見時,使用這兩種 API 沒有任何限制,但兩者都需要應用程式程序處於運作狀態。如果應用程式程序未執行,您可以使用下列解決方法:
BluetoothLeScanner:使用PendingIntent物件 (而非ScanCallback物件) 呼叫startScan(),以便在掃描到符合篩選條件的裝置時收到通知。(範例)CompanionDeviceManager:請按照「讓隨附應用程式保持喚醒狀態」中的指引,在先前關聯的裝置位於範圍內時,喚醒應用程式並保持喚醒狀態。(範例)
連結裝置
找到裝置後,如要連線至裝置,您需要從下列其中一個來源取得裝置的 BluetoothDevice 執行個體:
BluetoothLeScanner掃描結果,如上一節所述。- 從
BluetoothAdapter.getBondedDevices()擷取的繫結裝置清單。 BluetoothAdapter快取,使用BluetoothAdapter.getRemoteLeDevice()。
取得 BluetoothDevice 執行個體後,您可以呼叫其中一個 connectGatt() 方法,向對應的裝置發出連線要求。您傳入 autoConnect 布林值的值,會定義 GATT 用戶端使用下列哪一種連線模式:
- 直接連線 (
autoconnect = false):嘗試直接連線至周邊裝置,如果裝置無法使用,則會失敗。如果連線中斷,GATT 用戶端不會自動嘗試重新連線。 - 自動連線 (
autoconnect = true):只要周邊裝置可用,就嘗試自動連線。如果連線中斷是由周邊裝置發起,或周邊裝置超出範圍,GATT 用戶端會在周邊裝置可用時自動嘗試重新連線。
在背景中
應用程式在背景執行時,連線至裝置不受任何限制,但如果程序終止,連線就會關閉。此外,從背景啟動活動 (Android 10 以上版本) 或前景服務 (Android 12 以上版本) 也有限制。
因此,如要在背景執行連線,應用程式可以使用下列解決方案:
- 使用 WorkManager 連線至裝置。
- 您可以設定
PeriodicWorkRequest或OneTimeWorkRequest來執行定義的動作,但可能適用應用程式限制。 - 此外,您也可以善用 WorkManager 的功能,例如工作限制、加急作業、重試政策等。
- 如果連線需要盡可能保持運作,以便執行資料同步或從周邊裝置輪詢等工作,請按照「支援長時間執行的工作站」中的指引啟動前景服務。不過,自 Android 12 起,系統會套用前景服務啟動限制。
- 您可以設定
- 啟動
connectedDevice類型的前景服務。- 如果連線需要盡可能保持運作,以便執行資料同步或從周邊裝置輪詢等工作,請按照「支援長時間執行的工作站」中的指引啟動前景服務。不過,自 Android 12 起,系統會套用前景服務啟動限制。
- 使用
PendingIntent物件呼叫startScan()(如「尋找裝置」一節所述),以便在裝置存在時喚醒程序。周邊裝置必須處於廣告模式。- 建議您啟動 Worker 和 Job。這可能會受到系統干擾,因此只能支援短時間通訊。
- 在 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 支援這個用途,因為應用程式可能需要長時間持續監聽。不過,您也可以使用前景服務。
無論是哪種情況,您都可以按照「連線至裝置」一節中的操作說明,在程序終止後重新連線。