スタンドアロン デバイスでネットワーク経由で直接通信する

Wear OS by Google 搭載のスマートウォッチは、Android または iOS スマートフォンにアクセスせずにネットワークと直接通信できます。Data Layer API を使用して Wear OS アプリをネットワークに接続しないでください。代わりに、このガイドのガイドラインと手順を実施してください。

ネットワーク アクセス

Wear OS アプリはネットワーク リクエストを送信できます。スマートウォッチからスマートフォンへの Bluetooth 接続では、スマートウォッチのネットワーク トラフィックは通常、スマートフォンを介してプロキシ接続されます。

スマートフォンを使用できない場合は、スマートウォッチのハードウェアに応じて Wi-Fi ネットワークとモバイル ネットワークが使用されます。ネットワーク間の遷移は Wear OS プラットフォームによって処理されます。

HTTP、TCP、UDP などのプロトコルは使用できますが、ただし、CookieManager クラスを含む android.webkit API は使用できません。リクエストとレスポンスのヘッダーの読み取りと書き込みを行うと、Cookie を使用できます。

非同期リクエスト(一定間隔でのポーリングを含む)には WorkManager を使用します。

特定の種類のネットワークに接続する必要がある場合は、ネットワークの状態の読み取りをご覧ください。

高帯域幅ネットワークへのアクセス

Wear OS プラットフォームは、全体的なユーザー エクスペリエンスを最大限に高めることを目標としてネットワーク接続を管理します。このプラットフォームは、バッテリー駆動時間の長さとネットワーク帯域幅という 2 つの必要性のバランスを考慮して、デフォルトのアクティブなネットワークを選択します。

バッテリーの節約を優先すると、アクティブなネットワークにおける帯域幅の不足により、大きなファイルの転送やメディアのストリーミングなどのネットワーク タスクを実施できなくなることがあります。

このセクションでは、ConnectivityManager クラスを使用して、アプリに必要なネットワーク帯域幅を確保するためのガイダンスを示します。ネットワーク リソースをきめ細かく管理する方法については、ネットワーク使用状況を管理するをご覧ください。

Wi-Fi 接続をリクエストする

高帯域幅ネットワークにアクセスする必要があるユースケース(大きなファイルの転送やメディアのストリーミングなど)では、Wi-Fi などの高帯域幅転送による接続をリクエストします。これを次の例に示します。

val callback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        super.onAvailable(network)
        // The Wi-Fi network has been acquired. Bind it to use this network by default.
        connectivityManager.bindProcessToNetwork(network)
    }

    override fun onLost(network: Network) {
        super.onLost(network)
        // Called when a network disconnects or otherwise no longer satisfies this request
        // or callback.
    }
}

fun requestWifiNetwork() {
    connectivityManager.requestNetwork(
        NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(),
        callback
    )
}

スマートウォッチの Wi-Fi 通信またはモバイル通信は、バッテリーを節約するためにオフにされていることがあるため、ネットワークをすぐには確保できない場合があります。スマートウォッチがネットワークに接続できない場合、NetworkCallback インスタンスの onAvailable() メソッドは呼び出されません。

onAvailable() が呼び出されると、デバイスは NetworkCallback が解放されるまで Wi-Fi ネットワークへの接続を維持しようとします。バッテリーを節約するため、Wi-Fi ネットワークが不要になったら、次の例に示すようにコールバックを解放します。

connectivityManager.bindProcessToNetwork(null)
connectivityManager.unregisterNetworkCallback(callback)

Wi-Fi 設定アクティビティを開始する

Wi-Fi ネットワークをリクエストすると、保存済みネットワークが構成されていて範囲内にある場合、システムは保存済みネットワークに接続しようとします。使用可能な保存済み Wi-Fi ネットワークが存在しない場合、NetworkCallback インスタンスの onAvailable コールバック メソッドは呼び出されません。

ネットワーク リクエストをタイムアウトさせるために Handler を使用している場合は、タイムアウトが発生したときに Wi-Fi ネットワークを追加するようにユーザーを誘導できます。次のインテントを使用して、Wi-Fi ネットワークを追加するアクティビティに直接ユーザーを誘導します。

val networkSettingsAction = "com.google.android.clockwork.settings.connectivity.wifi.ADD_NETWORK_SETTINGS"
val intent = Intent(networkSettingsAction).apply {
    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
context.startActivity(intent)

設定アクティビティを開始するには、アプリに CHANGE_WIFI_STATE 権限が付与されている必要があります。

ユーザー インターフェースに関する考慮事項

アプリが高帯域幅オペレーションのために新しい Wi-Fi ネットワークへの接続を必要とする場合は、必要に応じてシームレスに取得してリリースする必要があります。Wi-Fi ネットワークが利用できない場合は、この機能には Wi-Fi が必要であることを説明し、Wi-Fi 設定アクティビティを起動する手段を提供します。高帯域幅ネットワークを必要としないアプリの機能をユーザーが利用することを妨げないでください。

電力とデータの使用に関する考慮事項

バッテリーを長持ちさせ、モバイルデータの使用量を最小限に抑えるには、Wear OS デバイスが LTE 接続や従量制接続ではなく、Bluetooth 接続や Wi-Fi 接続を再確立するまで、分析レポートの作成やログの収集などの必須でないネットワーク タスクを延期します。

クラウド メッセージング

通知を送信する場合は、Firebase Cloud Messaging(FCM)を直接使用します。

ネットワーク アクセス用や FCM 用の API は、Wear OS に固有のものではありません。ネットワークへの接続クラウド メッセージングに関する既存のドキュメントをご覧ください。

FCM は Doze モードで適切に機能するため、スマートウォッチに通知を送信するのに適しています。

Wear OS アプリの実行中にデバイスの登録トークンを収集することで、FCM からのメッセージに備えます。さらに、サーバーから FCM REST エンドポイントにメッセージを送信する際に、このトークンを宛先の一部として含めます。FCM は、トークンで指定されたデバイスにメッセージを送信します。

FCM メッセージは JavaScript Object Notation(JSON)形式であり、以下のペイロードのいずれかまたは両方を含めることができます。

  • 通知ペイロード: 通知ペイロードをスマートウォッチが受け取ると、通知ストリーム内でデータがユーザーに直接表示されます。ユーザーが通知をタップすると、アプリが起動します。
  • データ ペイロード: ペイロードにカスタムのキーまたは値のペアのセットが含まれている場合。Wear OS アプリにデータとして配信されます。

ペイロードの詳細と例については、メッセージ タイプをご覧ください。

デフォルトでは、通知はスマートフォン アプリからスマートウォッチにブリッジされます。スタンドアロンの Wear OS アプリとそれに対応するスマートフォン アプリを使用している場合、通知が重複することがあります。たとえば、スマートフォンとスマートウォッチの両方が FCM から受け取った 1 つの通知が、両方のデバイスで別々に表示されることがあります。これを防ぐには、ブリッジ API を使用します。

バックグラウンド サービスを使用する

バックグラウンド タスクが適切に実行されるようにするには、各タスクで Doze とアプリ スタンバイを考慮する必要があります。

画面がオフになるか、常に画面表示モードの状態が長く続くと、Doze のサブセットが開始され、バックグラウンド タスクが一定期間遅延されることがあります。その後、デバイスの静止状態が長く続くと、通常の Doze が開始されます。WorkManager API を使用してリクエストをスケジュール設定してください。それにより、アプリが Doze 対応のコード実行に登録できるようになります。

制約を含むスケジュールを設定する

制約を使用すると、バッテリーを節約するようにリクエストを構成できます。以下の制約から 1 つ以上選択し、リクエストに含めます。

  • ネットワーキングを必要とするリクエストをスケジュール設定します。

    NetworkTypeCONNECTEDUNMETERED かを指定します。UNMETERED は大規模なデータ転送に使用し、CONNECTED は小規模なデータ転送に使用します。

  • 充電中にリクエストをスケジュール設定します。

  • デバイスがアイドル状態のときにリクエストをスケジュール設定します。これは、特にデバイスが充電中のとき、優先度の低いバックグラウンド処理や同期に役立ちます。

詳細については、WorkManager の定期的な処理に対する制約の影響に関するガイドをご覧ください。