在 Wear OS 上存取網路和進行同步處理

手錶可以透過 Wear OS by Google 直接和網路通訊,不必存取 Android 或 iOS 裝置。請勿使用 Data Layer API 將 Wear OS 應用程式連線至網路。請改為按照本指南中的指示和步驟操作。

網路存取權

Wear OS 應用程式可以發出網路要求。如果手錶已透過藍牙連線到手機,則手錶的網路流量通常都會透過手機進行 Proxy 處理。

如果並無手機,則視手錶硬體而定,系統會選擇使用 Wi-Fi 和行動網路。網路轉換作業由 Wear OS 平台負責處理。

您可以使用 HTTP、TCP 和 UDP 等通訊協定,但無法使用 android.webkit API (包括 CookieManager 類別)。您可以藉由讀取/寫入要求及回應的標頭來使用 Cookie。

此外,也建議您使用 WorkManager API 進行非同步要求,包括定期輪詢。

如果需要連線到特定的網路類型,請參閱「讀取網路狀態」。

高頻寬網路存取權

Wear OS 平台會管理網路連線,以求提供最佳使用者體驗。平台會平衡以下兩項需求,藉此選擇預設使用的網路:

  • 長效電池續航力
  • 網路頻寬

當優先考量節省電池電量時,使用中的網路可能沒有足夠頻寬可處理網路工作,例如傳輸大量檔案或串流媒體。

本節提供使用 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() 後,裝置會先嘗試與 Wi-Fi 網路保持連線,直到釋出 NetworkCallback 為止。如要延長電池續航力,請在不再需要 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 裝置重新建立藍牙或 Wi-Fi 連線為止。

雲端通訊

若應用程式想傳送通知,可以直接使用 Firebase 雲端通訊 (FCM)

Wear OS 並無專用的網路存取或 FCM API。請參閱「連線到網路」及「雲端通訊」等現有說明文件。

FCM 可和「打盹」搭配使用,這是傳送通知到手錶時的推薦做法。

請在 Wear OS 應用程式執行期間收集裝置註冊權杖,藉此為 FCM 的訊息做好準備。然後在伺服器傳送訊息至 FCM REST 端點時,請把此權杖當做目的地之一。FCM 會傳送訊息到此權杖識別的裝置。

FCM 訊息採用 JavaScript Object Notation (JSON) 格式,可以包含以下兩種或其中一種酬載:

  • 通知酬載:當手錶收到通知酬載時,資料會直接在通知訊息串中向使用者顯示。使用者輕觸通知後,您的應用程式就會啟動。
  • 資料酬載:具有一組自訂鍵或值組合的酬載。酬載會以資料形式傳送到您的 Wear OS 應用程式。

如果想進一步瞭解酬載和查看範例,請參閱「關於 FCM 訊息」。

根據預設,系統會將通知從手機應用程式橋接到手錶。如果您有獨立的 Wear OS 應用程式和對應的手機應用程式,系統可能會重複發出通知。舉例來說,當手機和手錶同時收到 FCM 發出的某則通知後,兩個裝置可能會各自顯示這則通知。如要避免發生這種情況,可以使用橋接 API

使用背景服務

為確保背景工作可以正確執行,必須考慮使用「打盹」和「應用程式待命」功能。

當螢幕關閉或進入微光模式達到一定時間後,裝置會進入部分「打盹」模式,背景工作可能會因此延遲一段時間。之後,如果裝置長時間處於閒置狀態,便會進入常規「打盹」模式。使用 WorkManager API 排程要求,讓您的應用程式能夠進行註冊,進而在「打盹」模式下順利執行程式碼。

使用排程限制

您可以限制設定要求,藉此節省電力。請在您的要求中採用以下一或多種限制:

  • 排程需要網路的要求。指定 NetworkType 要採用 CONNECTED 還是 UNMETEREDUNMETERED 適合傳輸大型資料,而 CONNECTED 適合傳輸小型資料。
  • 在充電時排程要求。
  • 在裝置閒置時排程要求。低優先順序的背景工作或同步處理工作 (特別是當裝置在充電時處理的工作) 非常適合使用這個限制。

請注意,藍牙 LE 等部分低頻寬網路會視為計量付費網路。

詳情請參閱 WorkManager 的「限制條件對定期性作業的影響」指南。