このガイドでは、アプリがバックグラウンドで実行されているときに、周辺機器との通信に関する主なユースケースをサポートする方法の概要について説明します。
これらのユースケースをそれぞれサポートするオプションが複数あります。それぞれに長所と短所があり、特定のニーズに適している場合もあれば、適していない場合もあります。
次の図は、このページのガイダンスを簡略化したものです。

デバイスを探す
まず、アプリは接続先のデバイスを見つける必要があります。BLE デバイスを検出するには、次のいずれかの API を使用します。
BluetoothLeScanner(BLE デバイスを検索するを参照)(サンプル)- コンパニオン デバイスのペア設定に記載されている
CompanionDeviceManager。(サンプル)
バックグラウンド
アプリが表示されていないときにこれらの API を使用することに制限はありませんが、どちらの場合もアプリのプロセスが有効である必要があります。アプリプロセスが実行されていない場合は、次の回避策を使用できます。
BluetoothLeScannerの場合:ScanCallbackオブジェクトではなくPendingIntentオブジェクトを指定してstartScan()を呼び出し、フィルタに一致するデバイスがスキャンされたときに通知を受け取ります。(サンプル)CompanionDeviceManagerの場合: コンパニオン アプリを起動したままにするのガイダンスに沿って、以前に関連付けられたデバイスが範囲内にあるときにアプリを起動し、起動したままにします。(サンプル)
デバイスに接続
デバイスを検出した後に接続するには、次のいずれかのソースからデバイスの BluetoothDevice インスタンスを取得する必要があります。
- 前のセクションで説明した
BluetoothLeScannerスキャン結果。 BluetoothAdapter.getBondedDevices()から取得された、ボンディングされたデバイスのリスト。BluetoothAdapterキャッシュ。BluetoothAdapter.getRemoteLeDevice()を使用します。
BluetoothDevice インスタンスを取得したら、connectGatt() メソッドのいずれかを呼び出して、対応するデバイスへの接続リクエストを開始できます。autoConnect ブール値に渡す値によって、GATT クライアントが使用する次の 2 つの接続モードのいずれかが定義されます。
- 直接接続(
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のいずれかの権限を使用して、バックグラウンドからサービスを開始します。
デバイスに接続したままにする
理想的には、アプリは必要な間だけ周辺機器への接続を維持し、タスクが完了したら切断する必要があります。ただし、アプリが接続を無期限に維持する必要があるケースが 2 つあります。
どちらの場合も、次のオプションを使用できます。
CompanionDeviceServiceをREQUEST_COMPANION_RUN_IN_BACKGROUND権限とCompanionDeviceManager.startObservingDevicePresence()メソッドで使用します。- アプリがフォアグラウンドにある(または除外対象のいずれかである)ときに、
connectedDeviceフォアグラウンド タイプでフォアグラウンド サービスを開始します。
アプリを切り替えるとき
デバイスの検出、接続、データ転送には、時間とリソースを要します。ユーザーがアプリを切り替えたり、同時にタスクを実行したりするたびに接続が失われ、プロセス全体をやり直す必要が生じるのを避けるには、オペレーションが完了するまで接続を維持する必要があります。connectedDevice タイプのフォアグラウンド サービスまたは コンパニオン デバイス Presence API を使用できます。
周辺機器の通知をリッスンしているとき
アプリがペリフェラルの通知をリッスンするには、setCharacteristicNotification() を呼び出し、onCharacteristicChanged() を使用してコールバックをリッスンし、接続を維持する必要があります。ほとんどのアプリでは、アプリが長時間リッスンし続ける必要があるため、CompanionDeviceService でこのユースケースをサポートすることをおすすめします。ただし、フォアグラウンド サービスを使用することもできます。
いずれの場合も、デバイスに接続するセクションの手順に沿って、終了したプロセス後に再接続できます。