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

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

これらのユースケースをサポートする方法は複数あります。それぞれに利点と欠点があり、特定のニーズに適しているかどうかが異なります。

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

デバイスを探す

まず、接続するデバイスをアプリが検出する必要があります。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 でこのユースケースをサポートすることをおすすめします。ただし、フォアグラウンド サービスを使用することもできます。

どちらの場合も、終了したプロセスの後に再接続するには、デバイスに接続するの手順に沿って操作します。