このガイドでは、アプリがバックグラウンドで実行されているときに、周辺機器と通信するための主なユースケースをサポートする方法の概要を説明します。
それぞれのユースケースをサポートする複数のオプションがあります。それぞれに長所と短所があるため、特定のニーズに適している場合があります。
次の図は、このページのガイダンスを簡略化して示しています。
デバイスを探す
まず、アプリが接続するデバイスを見つける必要があります。BLE デバイスを見つけるには、次のいずれかの API を使用します。
バックグラウンド再生
これらの 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()
を呼び出し、デバイスが存在する場合にプロセスを起動します。周辺機器はアドバタイジングである必要があります。- Worker と Job を開始することをおすすめします。これはシステムによって中断される可能性があるため、短時間の通信のみをサポートできます。
- 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
でこのユースケースをサポートすることをおすすめします。ただし、フォアグラウンド サービスを使用することもできます。
いずれの場合も、デバイスに接続するセクションの手順に沿って、プロセスの終了後に再接続できます。