本指南說明如何讓應用程式保持運作、如何因應電源狀態轉換,以及如何管理應用程式行為,在節省電量的同時提供良好的使用者體驗。
持續顯示應用程式會大幅影響電池續航力,因此新增這項功能時,請注意對電量的影響。
核心概念
Wear OS 應用程式以全螢幕顯示時,會處於下列兩種電源狀態之一:
- 互動:高耗電狀態,螢幕亮度全開,可讓使用者充分互動。
- 微光:低耗電狀態,螢幕會調暗以節省電力。在這個狀態下,應用程式的 UI 仍會佔滿整個螢幕,但系統可能會模糊處理或顯示疊加內容 (例如時間),藉此改變 UI 外觀。這也稱為「微光模式」。
作業系統會控管這些狀態之間的轉換。
「一律啟用的應用程式」是指在「互動」和「微光」狀態下都會顯示內容的應用程式。
如果應用程式在裝置處於低功耗的微光狀態時,持續顯示自己的 UI,則稱為處於微光活動模式。
系統轉場效果和預設行為
應用程式在前台執行時,系統會根據使用者閒置時觸發的兩個逾時,管理電源狀態轉換。
- 逾時 #1:互動式狀態到微光狀態:使用者閒置一段時間後,裝置會進入微光狀態。
- 自動關閉 #2:返回錶面:如果裝置持續閒置,系統可能會隱藏目前開啟的應用程式,並顯示錶面。
系統第一次轉換為「微光」狀態後,預設行為會立即啟動,但會因 Wear OS 版本和應用程式設定而異:
- 在 Wear OS 5 以下版本,系統會顯示暫停應用程式的模糊螢幕截圖,並在上方疊加時間。此狀態在下列流程圖中以「AOD Lite」節點表示。
- 在 Wear OS 6 以上版本,如果應用程式指定 SDK 36 以上版本,系統會視為「一律開啟」。螢幕會調暗,但應用程式會繼續執行並保持顯示狀態。(更新頻率可能低至每分鐘一次)。下列流程圖中的「Global AOD」節點代表這個狀態。
自訂微光狀態的行為
無論系統預設行為為何,您都可以在所有 Wear OS 版本上,使用 LocalAmbientModeManager 觀察 Wear OS 版 Jetpack Compose 中的狀態轉換,藉此在微光狀態下自訂應用程式的外觀或行為。這個狀態在下列流程圖中以「Ambiactive Mode」節點表示。
觀察微光狀態
如要在 Wear OS 上的 Jetpack Compose 中回應微光模式事件,請按照下列步驟操作:
使用
LocalAmbientModeManager觀察系統的環境模式狀態變化,並據此調整可組合函式。設定元件,在AmbientMode.Ambient狀態下調整為低功耗模式,並在AmbientMode.Interactive狀態下還原為全互動式顯示。// In a production application, the AmbientModeManager should be instantiated and provided at // the highest level of the Compose hierarchy (typically in the host Activity's setContent // block) using a CompositionLocalProvider. This ensures proper lifecycle management and // broad accessibility. // For this self-contained demo, AmbientModeManager is created and provided locally: val activityAmbientModeManager = rememberAmbientModeManager() CompositionLocalProvider(LocalAmbientModeManager provides activityAmbientModeManager) { val ambientModeManager = LocalAmbientModeManager.current val ambientMode = ambientModeManager?.currentAmbientMode if (ambientModeManager != null) { ambientModeManager.AmbientTickEffect { // While device is in ambient mode, update properties every minute or so // ... } } // ... val ambientModeName = when (ambientMode) { is AmbientMode.Interactive -> "Interactive" is AmbientMode.Ambient -> "Ambient" else -> "Unknown" } Text(text = "$ambientModeName Mode") // ... }
環境行為流程圖
下方的流程圖說明系統如何根據裝置的 Wear OS 版本、應用程式的 targetSdkVersion,以及是否觀察環境狀態轉換 (使用 LocalAmbientModeManager 或 AmbientLifecycleCallback),判斷環境行為。
控制螢幕開啟時間
以下各節說明如何管理應用程式在螢幕上顯示的時間長度。
避免使用「持續進行的活動」或「即時更新」返回錶面
經過一段時間處於「微光」狀態 (逾時 #2) 後,系統通常會返回錶面。使用者可以在系統設定中設定逾時時間長度。在某些情況下,應用程式可能需要長時間顯示,例如使用者追蹤健身活動時。
在 Wear OS 5 以上版本中,您可以導入持續性活動,防止系統顯示這類通知。如果應用程式顯示使用者正在進行的工作相關資訊 (例如健身活動),您可以使用 Ongoing Activity API,讓應用程式保持顯示狀態,直到工作結束為止。如果使用者手動返回錶面,持續性活動指標提供一鍵式方式,讓他們返回您的應用程式。
或者,在 Wear OS 7 以上版本中,您可以使用即時更新取代持續性活動。為確保回溯相容性,請繼續在搭載 Wear OS 6 以下版本的裝置上支援「進行中的活動」。
如要實作這項功能,持續性通知的觸控意圖必須指向常時運作活動,如下列程式碼片段所示:
val activityIntent = Intent(this, AlwaysOnActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_SINGLE_TOP } val pendingIntent = PendingIntent.getActivity( this, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) // ... // ... .setOngoing(true) // ... val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // ... // ... .setTouchIntent(pendingIntent) .build() ongoingActivity.apply(applicationContext) val notification = notificationBuilder.build()
讓螢幕保持開啟,避免進入微光模式
在極少數情況下,您可能需要完全禁止裝置進入微光狀態。也就是避免發生逾時 #1。如要這麼做,可以使用 keepScreenOn 修飾符。這項功能會做為 Wake Lock,讓裝置保持在「互動」Interactive狀態。請務必謹慎使用這項功能,因為這會嚴重影響電池續航力。
微光模式建議
為提供最佳使用者體驗,並在微光模式下節省電力,請遵循這些設計指南。這些建議會優先考量清楚的使用者體驗,避免誤導資訊並減少視覺混亂,同時盡量提升顯示效果。
- 減少視覺雜亂感並降低螢幕耗電量。簡潔的極簡風 UI 可向使用者表明應用程式處於省電狀態,並限制亮像素,大幅節省電量。
- 螢幕至少要有 85% 的黑色 (亮點比例為 15% 或更低)。
- 僅顯示最重要的資訊,將次要詳細資料移至互動式螢幕。
- 針對大型圖示或按鈕使用外框,而非實心填滿,並調整外框對比度,確保元素清晰可讀,同時避免螢幕閃爍或烙印。
- 避免使用大面積的純色區塊,以及不具實際功能的品牌宣傳或背景圖片。
- 處理過時的動態資料和動畫
- 為節省電力,系統只會定期 (通常每分鐘一次) 叫用
AmbientTickEffect回呼。因此,任何經常變更的資料 (例如碼錶、心率或運動距離) 在更新之間都會過時。為避免顯示誤導和不正確的資訊,請將這些即時值替換為靜態預留位置內容,例如--。 - 移除需要頻繁更新的進度指標,以免對使用者當下的情境或情況造成干擾,例如短暫媒體工作階段的進度環。如果每分鐘更新一次仍有價值 (例如長時間的計時器),您可以保留進度指標。
- 暫停或移除微光模式中的所有動畫,包括動畫進度指標和捲動跑馬燈文字。
- 為節省電力,系統只會定期 (通常每分鐘一次) 叫用
- 維持一致的版面配置
- 在「互動」和「微光」模式中,讓元素保持在相同位置,營造流暢的轉換效果。由於新式 Wear OS 裝置在微光工作階段期間支援觸控輸入,因此按鈕等互動式 UI 元素可以保持顯示狀態。
- 一律顯示目前時間。在適用於 Wear OS 的 Jetpack Compose 中,
TimeText(預設包含在ScreenScaffold中) 會感知微光模式,並在微光模式下每分鐘自動更新一次。
- 瞭解情境
- 如果裝置進入微光模式時,使用者正在設定或配置畫面,請考慮顯示應用程式中更相關的畫面,而非設定檢視畫面。
- 處理裝置專屬需求
- 當
currentAmbientMode傳回AmbientMode.Ambient時:- 如果
isLowBitAmbientSupported為true,螢幕在微光模式下支援的每個顏色位元數較少。停用反鋸齒功能 (例如在自訂Canvas或Paint繪圖作業中),並盡可能避免使用色彩漸層。 - 如果
isBurnInProtectionRequired為true,系統會定期移動顯示內容,防止像素烙印。請勿手動移動應用程式中的 UI 元素。請避開純白色區域,並將重要 UI 元素放置在距離螢幕邊緣至少 10 像素的位置,以免系統移動螢幕時遭到裁剪。(標準 Wear Compose 版面配置 (例如ScreenScaffold) 已提供足夠的邊框間距。)
- 如果
- 當
偵錯和測試
開發或測試應用程式在裝置進入微光模式時的行為時,這些 adb 指令可能很有用:
# put device in ambient mode if the always on display is enabled in settings
# (and not disabled by other settings, such as theatre mode)
$ adb shell input keyevent KEYCODE_SLEEP
# put device in interactive mode
$ adb shell input keyevent KEYCODE_WAKEUP
示例:健身應用程式
假設某健身應用程式需要在整個運動期間向使用者顯示指標,應用程式必須在微光狀態轉換期間保持可見,且不得被錶面取代。
為此,開發人員應採取下列做法:
- 使用
LocalAmbientModeManager處理「互動」和「微光」狀態之間的 UI 變化,例如調暗螢幕和移除非必要資料。 - 為「微光」狀態建立新的低耗電版面配置,並遵循最佳做法。
- 在運動期間使用 Ongoing Activity API (或 Wear OS 7 以上版本的 Live Updates),防止系統返回錶面。
如需完整實作方式,請參閱 GitHub 上以 Compose 為基礎的運動範例。這個範例也示範如何使用 LocalAmbientModeManager 可組合函式,簡化 Compose 中的微光模式處理作業。