本指南概要說明應用程式在背景執行時,如何支援與週邊裝置通訊的重要用途:
在這些用途中,您都能透過多種方式支援。每種方法各有優缺點,可能都較適合您的特定需求。
下圖為本頁指南的簡化檢視畫面:
尋找裝置
首先,應用程式需要尋找要連線的裝置。如要尋找 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
支援這個用途,因為應用程式可能需要長時間監聽。不過,您也可以使用前景服務。
不論是哪一種情況,您都可以在終止程序後重新連線,請按照連線至裝置一節中的指示操作。