Wear OS でのネットワーク アクセスと同期

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

ネットワーク アクセス

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

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

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

また、非同期リクエストでは WorkManager API を使用する(たとえば、定期的にポーリングする)ことをおすすめします。

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

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

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

  • バッテリーの節約
  • ネットワーク帯域幅

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

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

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

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

Kotlin

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.
    }
}
connectivityManager.requestNetwork(
    NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(),
    callback
)

Java

ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() {
    public void onAvailable(Network network) {
        super.onAvailable(network);
        // The Wi-Fi network has been acquired. Bind it to use this network by default.
        connectivityManager.bindProcessToNetwork(network);
    }

    public void onLost(Network network) {
        super.onLost(network);
        // Called when a network disconnects or otherwise no longer satisfies this request or callback.
    }
};
connectivityManager.requestNetwork(
        new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(),
        callback
);

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

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

Kotlin

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

Java

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

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

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

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

Kotlin

context.startActivity(Intent("com.google.android.clockwork.settings.connectivity.wifi.ADD_NETWORK_SETTINGS"))

Java

context.startActivity(new Intent("com.google.android.clockwork.settings.connectivity.wifi.ADD_NETWORK_SETTINGS"));

設定アクティビティを開始するには、アプリに android.permission.CHANGE_WIFI_STATE 権限が必要です。

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

アプリが高帯域幅オペレーションのために新しい Wi-Fi ネットワークへの接続を必要とする場合は、Wi-Fi の設定を開始する前に、接続する理由をユーザーに明確に示してください。高帯域幅ネットワークが必要な場合にのみ、新しい Wi-Fi ネットワークを追加するようユーザーにリクエストします。高帯域幅ネットワークを必要としないアプリの機能をユーザーが利用することを妨げないでください。

図 1 は音楽アプリの例を示しています。このアプリでは、ユーザーは低帯域幅ネットワークで音楽をブラウジングすることができ、音楽をダウンロードまたはストリーミングする場合にのみ、新しい Wi-Fi ネットワークを追加するよう求められます。

音楽のダウンロード

図 1. 音楽アプリのダウンロード フロー

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

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

クラウド メッセージング

通知を送信する場合、アプリは Firebase Cloud Messaging(FCM)を直接使用できます。

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

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

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

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

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

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

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

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

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

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

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

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

  • ネットワーキングを必要とするリクエストをスケジュール設定します。NetworkTypeCONNECTEDUNMETERED かを指定します。UNMETERED は大規模なデータ転送に使用し、CONNECTED は小規模なデータ転送に使用します。
  • 充電中にリクエストをスケジュール設定します。
  • デバイスがアイドル状態のときにリクエストをスケジュール設定します。これは、特にデバイスが充電中のとき、優先度の低いバックグラウンド処理や同期に役立ちます。

Bluetooth LE などの一部の低帯域幅ネットワークは従量制とみなされます。

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