バックグラウンドでのコミュニケーション

このガイドでは、アプリがバックグラウンドで実行されているときに、周辺機器と通信するための主なユースケースをサポートする方法の概要を説明します。

それぞれのユースケースをサポートする複数のオプションがあります。それぞれに長所と短所があるため、特定のニーズに適している場合があります。

次の図は、このページのガイダンスを簡略化して示しています。

デバイスを探す

まず、アプリが接続するデバイスを見つける必要があります。BLE デバイスを見つけるには、次のいずれかの API を使用します。

バックグラウンド再生

これらの API はいずれも、アプリが表示されていないときに使用できる場合に制限はありませんが、アプリプロセスが稼働している必要があります。アプリプロセスが実行されていない場合は、次の回避策を使用できます。

デバイスに接続

見つかったデバイスに接続するには、次のいずれかのソースから、そのデバイスの BluetoothDevice インスタンスを取得する必要があります。

BluetoothDevice インスタンスを作成したら、connectGatt() メソッドのいずれかを呼び出すことで、対応するデバイスへの接続リクエストを開始できます。autoConnect ブール値に渡す値により、GATT クライアントが使用する次の 2 つの接続モードのうち、どれを使用するかが定義されます。

  • 直接接続autoconnect = false): 周辺機器デバイスに直接接続し、デバイスが利用できない場合は失敗します。切断された場合、GATT クライアントは自動的に再接続を試行しません。
  • 自動接続autoconnect = true): 周辺機器が使用可能な場合は常に、周辺機器に自動的に接続できるようにします。ペリフェラルによって接続が切断された場合、またはペリフェラルが通信範囲外にある場合、GATT クライアントは、そのペリフェラルが使用可能になると自動的に再接続を試みます。

バックグラウンド再生

アプリがバックグラウンドで実行されている場合、デバイスへの接続に制限はありません。ただし、プロセスが強制終了されると接続は閉じられます。さらに、バックグラウンドからのアクティビティの開始に関する制限(Android 10 以降)またはフォアグラウンド サービス(Android 12 以降)があります。

したがって、バックグラウンドで接続を行うには、アプリで次の方法を使用できます。

デバイスとの接続を維持

理想的には、アプリは必要な期間だけ周辺機器との接続を維持し、タスクが完了したら接続を解除する必要があります。ただし、次の 2 つのケースでは、アプリで接続を無期限に維持する必要があります。

どちらの場合も、次のオプションを使用できます。

アプリを切り替えているとき

デバイスの検索、デバイスへの接続、データの転送は、時間とリソースを大量に消費します。ユーザーがアプリを切り替えたり、同時タスクを実行したりするたびに、接続が失われることや、プロセス全体を実行する必要がないようにするには、オペレーションが完了するまで接続を維持する必要があります。connectedDevice タイプのフォアグラウンド サービス、またはコンパニオン デバイス プレゼンス API を使用できます。

周辺機器の通知を再生中の場合

周辺機器の通知をリッスンするには、アプリで setCharacteristicNotification() を呼び出して、onCharacteristicChanged() を使用してコールバックをリッスンし、接続を維持する必要があります。ほとんどのアプリでは、長時間リッスンが必要になる可能性が高いため、CompanionDeviceService でこのユースケースをサポートすることをおすすめします。ただし、フォアグラウンド サービスを使用することもできます。

いずれの場合も、デバイスに接続するセクションの手順に沿って、プロセスの終了後に再接続できます。