Mobile Development 16 min read

Unlock Wear OS Development: History, Features, and Compose Code Samples

This article walks through Wear OS’s evolution, core advantages, competitor comparison, essential development principles, and provides hands‑on Compose code examples—including a food‑selector app and a ScalingLazyColumn todo list—to help developers build efficient, battery‑friendly smartwatch applications.

AndroidPub
AndroidPub
AndroidPub
Unlock Wear OS Development: History, Features, and Compose Code Samples

1. The Evolution of Wear OS

Wear OS originated as Android Wear in March 2014 with the Moto 360, progressed through Android Wear 2.0 (2016), rebranded to Wear OS by Google (2018), and saw major updates in Wear OS 3.0 (2021) and 4.0 (2023). The current Wear OS 5.1 runs on Android 15, emphasizing privacy, smoother performance, and broader brand adoption.

2. Advantages of Wear OS Apps

Interaction Experience

Tiles let users swipe left/right to view weather, schedule, steps, etc., without opening apps.

Complications embed heart‑rate, battery, alarm, and other data directly on the watch face for instant glance.

Smart notification sync enables quick replies via voice or preset phrases.

Health Tracking

Supports heart‑rate, SpO₂, sleep, stress monitoring; high‑end models add ECG.

Offers 100+ sport modes with real‑time calorie and pace calculations.

Improved sensor permissions and emulator support make testing easier, boosting user engagement for fitness apps.

Personalization

Full‑range customization of fonts, hands, backgrounds, and third‑party plug‑ins.

Google’s Watch Face Studio enables zero‑code watch‑face creation.

Material You dynamic theming automatically matches the watch strap or phone theme.

Performance & Battery

Wear OS 5 reduces power consumption by ~20% for long‑duration activities.

Background smart management freezes idle apps and wakes sensors on demand, delivering 1.5–2 days of typical use.

Snapdragon Wear W5+ chips double app launch speed, eliminating noticeable lag.

3. Comparison with Competing Platforms

Wear OS stands out for cross‑brand compatibility (Android & iPhone) and a richer Google‑backed app ecosystem, while Tizen, watchOS, and Harmony OS each have narrower compatibility or ecosystem constraints.

4. Core Principles for Wear OS Development

Focus on 1–2 core tasks; keep interactions under 10 seconds.

Design for 1.2–1.6 inch screens: minimum 48×48 dp touch targets, shallow navigation (max two levels), and primarily vertical scrolling.

Strictly control power: limit background wake‑ups, adjust sensor sampling rates, batch network requests.

Follow Google’s Material Design guidelines for watch‑face complications, notification cards, and UI feedback.

Provide offline capabilities (e.g., cached maps, local music) to reduce phone‑dependency.

5. Wear OS vs. Phone OS Development

Key differences include tiny circular screens versus large rectangular ones, single‑task focus versus multi‑task richness, vertical‑only gestures versus multi‑finger gestures, high power constraints, reliance on wearable‑specific sensors, and the need for Wear OS‑specific components such as ScalingLazyColumn and TimeText. Testing requires Wear OS emulators or real devices, and publishing demands a dedicated Wear OS review.

6. Practical Compose Development

Below are step‑by‑step code samples for a simple “What to eat today?” selector and a todo‑list using ScalingLazyColumn.

dependencies {
    // Compose for Wear OS core
    implementation "androidx.wear.compose:compose-foundation:1.2.1"
    implementation "androidx.wear.compose:compose-material3:1.2.1"
    implementation "androidx.wear.compose:compose-navigation:1.2.1"

    // Other required libraries
    implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0'
    implementation 'androidx.activity:activity-compose:1.8.2'
}
@Composable
fun FoodSelectorScreen() {
    val foodList = listOf("汉堡", "寿司", "火锅", "麻辣烫", "炸鸡", "沙拉")
    var selectedFood by remember { mutableStateOf("点击按钮选餐") }
    Scaffold(
        timeText = { TimeText(color = Color.Black) },
        positionIndicator = { PositionIndicator(scrollState = ScrollState(0)) }
    ) { innerPadding ->
        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(innerPadding)
                .verticalScroll(ScrollState(0)),
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.Center
        ) {
            Text(
                text = "今日吃什么?",
                style = MaterialTheme.typography.titleLarge,
                fontSize = 18.sp,
                modifier = Modifier.padding(bottom = 20.dp)
            )
            Text(
                text = selectedFood,
                style = MaterialTheme.typography.bodyLarge,
                textAlign = TextAlign.Center,
                modifier = Modifier.padding(bottom = 30.dp),
                color = Color(0xFFE63946)
            )
            Button(
                onClick = { selectedFood = foodList.random() },
                modifier = Modifier.padding(horizontal = 20.dp)
            ) { Text(text = "随机选择") }
        }
    }
}
@Composable
fun FoodAppNavHost() {
    val navController = rememberNavController()
    NavHost(navController = navController, startDestination = "food_selector") {
        composable("food_selector") {
            FoodSelectorScreen()
            Button(onClick = { navController.navigate("settings") }) {
                Text(text = "设置餐单")
            }
        }
        composable("settings") {
            SettingsScreen(navController = navController)
        }
    }
}

@Composable
fun SettingsScreen(navController: NavHostController) {
    Scaffold(timeText = { TimeText() }) { innerPadding ->
        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(innerPadding),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = "餐单设置", modifier = Modifier.padding(bottom = 20.dp))
            // Add add/remove logic here
            Button(onClick = { navController.popBackStack() }) {
                Text(text = "返回")
            }
        }
    }
}
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MaterialTheme {
                FoodAppNavHost()
            }
        }
    }
}
BoxWithConstraints {
    if (isRound) {
        Text("圆形屏幕专属内容", modifier = Modifier.padding(20.dp))
    } else {
        Text("矩形屏幕专属内容")
    }
}
@Composable
fun TodoListScreen() {
    val todoList = listOf(
        TodoItem(1, "早上8点开会"),
        TodoItem(2, "买 groceries"),
        TodoItem(3, "写Wear OS代码"),
        TodoItem(4, "晚上跑步30分钟"),
        TodoItem(5, "给家人打电话")
    )
    Scaffold(
        timeText = { TimeText() },
        positionIndicator = { PositionIndicator(scrollState = it) }
    ) { innerPadding ->
        ScalingLazyColumn(
            modifier = Modifier
                .fillMaxSize()
                .padding(innerPadding)
        ) {
            items(todoList) { todo ->
                Text(
                    text = todo.content,
                    modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp),
                    style = androidx.wear.compose.material3.MaterialTheme.typography.bodyLarge
                )
            }
        }
    }
}

7. Pitfalls to Avoid

Always adapt layouts for circular screens using BoxWithConstraints to avoid clipping.

Prefer WorkManager over persistent background services to conserve battery.

Adjust sensor sampling rates to match use‑case (low for step counting, high for active workouts).

Test on multiple devices (e.g., Pixel Watch and Samsung Galaxy Watch) to ensure compatibility across hardware variations.

mobile developmentKotlinWear OSComposesmartwatch
AndroidPub
Written by

AndroidPub

Senior Android Developer & Interviewer, regularly sharing original tech articles, learning resources, and practical interview guides. Welcome to follow and contribute!

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.