このガイドでは、アプリがバックグラウンドで実行されているときに、周辺機器と通信するための主なユースケースをサポートする方法の概要について説明します。
これらのユースケースをサポートする方法は複数あります。それぞれに利点と欠点があり、特定のニーズに適しているかどうかが異なります。
次の図は、このページのガイダンスを簡略化したものです。
デバイスを探す
まず、接続するデバイスをアプリが検出する必要があります。BLE デバイスを検出するには、次のいずれかの API を使用します。
- BLE デバイスを検出するで説明されている
BluetoothLeScanner
。(サンプル) - コンパニオン デバイスのペア設定で説明されている
CompanionDeviceManager
。(サンプル)
バックグラウンド
アプリが可視でない間、これらの API のいずれかを使用する制限はありませんが、どちらもアプリのプロセスが存続している必要があります。アプリのプロセスが実行されていない場合は、次の回避策を使用できます。
BluetoothLeScanner
の場合:ScanCallback
オブジェクトではなくPendingIntent
オブジェクトを使用してstartScan()
を呼び出し、フィルタに一致するデバイスがスキャンされたときに通知を受け取ります。(サンプル)CompanionDeviceManager
の場合: コンパニオン アプリを起動したままにするのガイダンスに沿って、アプリを起動し、以前に関連付けたデバイスが範囲内にある間は起動したままにします。(サンプル)
デバイスに接続
デバイスを検出した後にデバイスに接続するには、次のいずれかのソースからデバイスの BluetoothDevice
インスタンスを取得する必要があります。
- 前のセクションで説明した
BluetoothLeScanner
スキャン結果。 BluetoothAdapter.getBondedDevices()
から取得された、ペア設定されたデバイスのリスト。BluetoothAdapter.getRemoteLeDevice()
を使用するBluetoothAdapter
キャッシュ。
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()
を呼び出し、デバイスが存在するときにプロセスを起動します。ペリフェラル デバイスがアドバタイズされている必要があります。- ワーカーとジョブを開始することをおすすめします。これはシステムによって中断される可能性があるため、短時間の通信のみをサポートできます。
- Android 12 より前のバージョンでは、
PendingIntent
オブジェクトから直接フォアグラウンド サービスを開始できます。
- バックグラウンドからサービスを開始するには、
CompanionDeviceService
とREQUEST_COMPANION_RUN_IN_BACKGROUND
権限またはREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
権限のいずれかを使用します。
デバイスに接続したままにする
理想的には、アプリは必要な期間のみ周辺機器との接続を維持し、タスクが完了したら接続を切断する必要があります。ただし、アプリで接続を無期限に維持する必要がある場合が 2 つあります。
どちらの場合も、次のオプションを使用できます。
REQUEST_COMPANION_RUN_IN_BACKGROUND
権限とCompanionDeviceManager.startObservingDevicePresence()
メソッドでCompanionDeviceService
を使用します。- アプリがフォアグラウンドにある(または除外のいずれか内にある)ときに、
connectedDevice
フォアグラウンド タイプでフォアグラウンド サービスを開始します。
アプリを切り替えている間
デバイスの検索、接続、データ転送は時間がかかり、リソースを大量に消費します。ユーザーがアプリを切り替えたり、タスクを同時に実行したりするたびに接続が切断され、プロセス全体を実行し直す必要がないようにするには、オペレーションが完了するまで接続を維持する必要があります。connectedDevice
タイプのフォアグラウンド サービスまたはコンパニオン デバイスの在庫状況 API を使用できます。
周辺機器の通知を聞いている間
周辺機器の通知をリッスンするには、アプリは setCharacteristicNotification()
を呼び出し、onCharacteristicChanged()
を使用してコールバックをリッスンし、接続を維持する必要があります。ほとんどのアプリでは、アプリが長時間リスニングを続ける必要があるため、CompanionDeviceService
でこのユースケースをサポートすることをおすすめします。ただし、フォアグラウンド サービスを使用することもできます。
どちらの場合も、終了したプロセスの後に再接続するには、デバイスに接続するの手順に沿って操作します。