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

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Wear OS by Google 搭載のスマートウォッチは、Android または iOS スマートフォンにアクセスせずにネットワークと直接通信できます。ネットワークへの接続に Data Layer API は使用しないでください。

ネットワーク アクセス

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)
        // The Wi-Fi network has been disconnected
    }
}
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);
        // The Wi-Fi network has been disconnected
    }
};
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: 音楽アプリのダウンロード フロー

クラウド メッセージング

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

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

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

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

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

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

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

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

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

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

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

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

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

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

一部の低帯域幅ネットワーク(Bluetooth LE など)は従量制と見なされることにご注意ください。

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