環境配置與項目搭建
1. Gradle 依賴配置
// build.gradle (Module)
android {buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion "1.5.3"}
}dependencies {def wear_compose_version = "1.2.0"implementation "androidx.wear.compose:compose-material:$wear_compose_version"implementation "androidx.wear.compose:compose-foundation:$wear_compose_version"implementation "androidx.wear.compose:compose-navigation:$wear_compose_version"implementation "androidx.activity:activity-compose:1.8.0"// 添加健康服務支持implementation "androidx.health:health-services-client:1.0.0-beta02"
}
核心組件深度解析
1. 自適應布局容器
@Composable
fun HealthDataScreen() {val scrollState = rememberScalingLazyListState()ScalingLazyColumn(modifier = Modifier.fillMaxSize().background(MaterialTheme.colors.background),state = scrollState,anchorType = ScalingLazyListAnchorType.ItemStart) {item { Header(modifier = Modifier.padding(8.dp),text = "健康數據監測") }items(healthItems) { item ->HealthChip(item = item,onItemClick = { navigateToDetail(item.id) })}item {Spacer(modifier = Modifier.height(16.dp))CircularProgressIndicator(modifier = Modifier.size(24.dp).align(Alignment.CenterHorizontally))}}TimeText(modifier = Modifier.scrollAway(scrollState),timeSource = TimeTextDefaults.timeSource(timeFormat = "HH:mm",timeZone = TimeZone.currentSystemDefault()))
}@Composable
fun HealthChip(item: HealthItem, onItemClick: () -> Unit) {Chip(modifier = Modifier.padding(4.dp),onClick = onItemClick,colors = ChipDefaults.chipColors(backgroundColor = MaterialTheme.colors.surface,contentColor = MaterialTheme.colors.onSurface),border = ChipDefaults.chipBorder(borderWidth = 1.dp,borderColor = MaterialTheme.colors.outline),label = {Text(text = item.title,style = MaterialTheme.typography.body2)},icon = {Icon(imageVector = item.icon,contentDescription = null,modifier = Modifier.size(24.dp)})
}
2. 健康數據集成實現
class HealthDataManager(context: Context) {private val healthClient = HealthServices.getClient(context)private var heartRateListener: HeartRateListener? = nullsuspend fun startHeartRateMonitoring() {val request = SensorRegistrationRequest(sensorType = SensorType.HEART_RATE,reportingMode = ReportingMode.RECEIVE_IF_INACTIVE,sampleInterval = 5.seconds)try {healthClient.registerSensorListener(object : HeartRateListener {override fun onHeartRateUpdate(data: HeartRateData) {// 更新UI或存儲數據Log.d("Health", "當前心率: ${data.value} BPM")}},request)} catch (e: Exception) {Log.e("Health", "傳感器注冊失敗", e)}}fun stopMonitoring() {heartRateListener?.let {healthClient.unregisterSensorListener(it)}}
}// 在ViewModel中使用
class HealthViewModel(application: Application) : AndroidViewModel(application) {private val healthManager = HealthDataManager(application)init {viewModelScope.launch {healthManager.startHeartRateMonitoring()}}override fun onCleared() {healthManager.stopMonitoring()super.onCleared()}
}
高級導航架構
1. 分層導航實現
@Composable
fun WearApp() {val navController = rememberSwipeDismissableNavController()SwipeDismissExample(navController) {NavHost(navController = navController,startDestination = Screen.Main.route) {composable(Screen.Main.route) {MainScreen(onNavigateToDetail = { id ->navController.navigate("${Screen.Detail.route}/$id")})}composable(route = "${Screen.Detail.route}/{id}",arguments = listOf(navArgument("id") { type = NavType.IntType })) { backStackEntry ->DetailScreen(itemId = backStackEntry.arguments?.getInt("id") ?: 0,onBack = { navController.popBackStack() })}}}
}sealed class Screen(val route: String) {object Main : Screen("main")object Detail : Screen("detail")
}
設備適配策略
1. 多形態屏幕適配
@Composable
fun AdaptiveLayout() {val windowInfo = rememberWindowInfo()when (windowInfo.devicePosture) {is DevicePosture.Flat -> {// 普通模式布局StandardLayout()}is DevicePosture.HalfOpened -> {// 折疊半開模式HalfOpenLayout()}else -> {// 默認布局DefaultLayout()}}
}@Composable
fun rememberWindowInfo(): WindowInfo {val context = LocalContext.currentval windowInfo = remember {WindowInfoRepository.getOrCreate(context)}return windowInfo
}
性能優化實踐
1. 智能緩存策略
@Composable
fun ComplexDataView() {val viewModel: HealthViewModel = viewModel()val dataState by viewModel.complexDataState.collectAsState()when (dataState) {is DataState.Loading -> ShowLoading()is DataState.Success -> ShowData((dataState as DataState.Success).data)is DataState.Error -> ShowError()}
}class HealthViewModel : ViewModel() {private val _complexDataState = mutableStateOf<DataState>(DataState.Loading)val complexDataState: State<DataState> = _complexDataStateinit {loadData()}private fun loadData() {viewModelScope.launch {_complexDataState.value = DataState.Loadingtry {val result = computeExpensiveData()_complexDataState.value = DataState.Success(result)} catch (e: Exception) {_complexDataState.value = DataState.Error(e.message)}}}private suspend fun computeExpensiveData(): HealthData {return withContext(Dispatchers.Default) {// 模擬復雜計算delay(1000)HealthData(...)}}
}
發布配置與優化
1. 構建配置最佳實踐
android {defaultConfig {minSdk 26targetSdk 34versionCode generateVersionCode()versionName "2.1.0-wear"// Wear OS 專屬配置resConfigs "en", "zh-rCN"wearAppUnbundled true}buildTypes {release {minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt')}}compileOptions {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17}kotlinOptions {jvmTarget = "17"}
}def generateVersionCode() {return (new Date().format('yyyyMMddHH').toInteger())
}
關鍵注意事項
-
交互設計規范
- 保持單次交互在5秒內完成
- 所有可點擊區域 ≥ 48dp
- 優先使用系統級手勢(如右滑返回)
-
功耗優化
fun updateDataStrategy() {if (isAmbientMode) {// 省電模式更新間隔setUpdateInterval(60_000L) } else {setUpdateInterval(1_000L)} }
-
Always-on Display 適配
@Composable fun AmbientModeAwareText(text: String) {val ambientState = ambientAware()Text(text = if (ambientState.isAmbient) simplifyText(text) else text,color = if (ambientState.isAmbient) Color.White else MaterialTheme.colors.primary,style = MaterialTheme.typography.body1) }
測試與驗證
-
性能基準測試
@RunWith(AndroidJUnit4::class) class PerformanceTest {@get:Ruleval rule = createComposeRule()@Testfun testMainScreenPerformance() {rule.setContent {MainScreen()}rule.onRoot().assertNoIdleResources()rule.waitForIdle()// 測量幀率val stats = rule.frameStats()assertThat(stats.avgFps).isGreaterThan(45)} }
-
功耗監測
adb shell dumpsys batterystats --reset # 執行測試用例 adb shell dumpsys batterystats --charged <package_name>
總結與最佳實踐
通過上述完整實現方案,我們構建了一個符合 Wear OS 設計規范的健壯應用。關鍵實踐包括:
- 分層架構設計:清晰的 ViewModel + Repository 結構
- 響應式 UI:充分利用 Compose 的狀態管理
- 性能優先:智能數據加載策略和計算緩存
- 設備感知:自適應不同穿戴設備形態
- 健康數據集成:規范使用 Health Services API
建議結合最新 Wear OS 設計指南進行以下優化:
- 實現 Material You 動態主題
- 添加觸覺反饋(Haptic Feedback)
- 集成 Google 健身數據平臺
- 支持跨設備數據同步