跳转到正文
YGJoon
返回

Android Kotlin Wear OS 与 Compose 多端协同

编辑文章

开发环境

Gradle 配置:

dependencies {
    implementation("androidx.wear.compose:compose-foundation:1.3.0")
    implementation("androidx.wear.compose:compose-material:1.3.0")
    implementation("androidx.wear.tiles:tiles:1.3.0")
    implementation("androidx.wear.tiles:tiles-material:1.3.0")
}

Compose 布局差异

@Composable
fun WearHomeScreen() {
    Scaffold(
        timeText = { TimeText() },
        vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) },
        positionIndicator = { PositionIndicator() }
    ) {
        ScalingLazyColumn {
            item { Text("心率", style = MaterialTheme.typography.titleMedium) }
            items(steps) { step -> Text(step.toString()) }
        }
    }
}

手机与手表协同

@Serializable
data class HealthSnapshot(val steps: Int, val heartRate: Int)

suspend fun sendSnapshot(client: MessageClient, nodeId: String, snapshot: HealthSnapshot) {
    val payload = Json.encodeToString(snapshot).encodeToByteArray()
    client.sendMessage(nodeId, "/health", payload)
}

手表端接收:

class WearMessageService : WearableListenerService() {
    override fun onMessageReceived(messageEvent: MessageEvent) {
        if (messageEvent.path == "/health") {
            val snapshot = Json.decodeFromString<HealthSnapshot>(String(messageEvent.data))
            scope.launch { repository.update(snapshot) }
        }
    }
}

Tiles 与 Complications

class StepsTileService : TileService() {
    override fun onTileRequest(requestParams: TileRequest): ListenableFuture<Tile> {
        val timeline = Timeline.Builder()
            .addTimelineEntry(TimelineEntry.Builder().setLayout(stepsLayout()).build())
            .build()
        return Futures.immediateFuture(Tile.Builder().setResourcesVersion("1").setTimeline(timeline).build())
    }
}

测试与调试

性能与功耗

常见问题

问题原因解决方案
数据延迟蓝牙或网络连接不稳定在发送前检测节点连接状态,增加重试
UI 截断圆形屏幕未处理安全区域使用 Modifier.fillMaxSize().padding(innerPadding)
编译依赖冲突Wear Compose 与手机 Compose 版本不一致对齐 Compose BOM 版本

总结

动手表端 Compose 需要适应圆形屏幕与功耗限制。通过 Data Layer API 实现手机与手表数据同步,结合 Tiles 提供一目了然的信息展示。合理规划同步频率与布局,可实现跨端一致体验。


编辑文章
分享这篇文章:

上一篇
Android Kotlin WorkManager 后台任务策略
下一篇
Android Kotlin Room 数据库进阶实践