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

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

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

次の図は、このページのガイダンスを簡略化したものです。

デバイスを探す

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

バックグラウンド

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

デバイスに接続

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

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

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

バックグラウンド

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

したがって、バックグラウンドで接続を実行するには、アプリで次のソリューションを使用します。

デバイスに接続したままにする

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

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

アプリを切り替えるとき

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

周辺機器の通知をリッスンしているとき

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

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