You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wear OS开发:如何无需用户操作从主应用向Tile发送数据?

Wear OS 主应用向Tile传输简单数据方案

针对你需要无用户操作传输简单字符串的需求,推荐以下两种轻量方案:

方案1:SharedPreferences + 主动触发Tile更新

你之前用SharedPreferences无效,大概率是因为更新数据后没有通知Tile刷新,导致Tile读取的是旧数据。按以下步骤操作:

主应用写入数据并触发更新

// 主应用中写入字符串到SharedPreferences
val sharedPref = getSharedPreferences("tile_shared_data", Context.MODE_PRIVATE)
sharedPref.edit().putString("target_key", "foo").apply()

// 主动触发Tile更新,让Tile读取最新数据
TileService.requestUpdate(this, YourTileService::class.java)

TileService中读取数据

在自定义的TileService的onTileRequest方法中读取数据并构建Tile:

override fun onTileRequest(requestParams: RequestParams): ListenableFuture<Tile> {
    // 读取SharedPreferences中的数据
    val sharedPref = getSharedPreferences("tile_shared_data", Context.MODE_PRIVATE)
    val receivedData = sharedPref.getString("target_key", "")
    
    // 用读取到的数据构建Tile布局
    return Futures.immediateFuture(buildTileContent(receivedData))
}

private fun buildTileContent(data: String): Tile {
    return Tile.Builder()
        .setResourcesVersion("1")
        .setTimeline(
            Timeline.Builder()
                .addTimelineEntry(
                    TimelineEntry.Builder()
                        .setLayout(
                            Layout.Builder()
                                .setRoot(
                                    Text.Builder()
                                        .setText(data)
                                        .build()
                                )
                                .build()
                        )
                        .build()
                )
                .build()
        )
        .build()
}

方案2:Jetpack DataStore(现代替代方案)

如果你偏好更安全的异步存储方案,可以用Jetpack DataStore的Preferences版本,同样结合Tile更新:

主应用写入数据并触发更新

先定义DataStore实例:

// 全局定义DataStore
val Context.tileDataStore: DataStore<Preferences> by preferencesDataStore(name = "tile_prefs")

然后在主应用中写入并触发更新:

val DATA_KEY = stringPreferencesKey("tile_data_key")

lifecycleScope.launch {
    // 异步写入数据
    tileDataStore.edit { prefs ->
        prefs[DATA_KEY] = "foo"
    }
    // 触发Tile刷新
    TileService.requestUpdate(this@MainActivity, YourTileService::class.java)
}

TileService中读取数据

在TileService中同样定义DataStore并读取:

val Context.tileDataStore: DataStore<Preferences> by preferencesDataStore(name = "tile_prefs")
private val DATA_KEY = stringPreferencesKey("tile_data_key")

override fun onTileRequest(requestParams: RequestParams): ListenableFuture<Tile> {
    val tileFuture = SettableFuture.create<Tile>()
    
    lifecycleScope.launch {
        // 异步读取最新数据
        val receivedData = tileDataStore.data.first()[DATA_KEY] ?: ""
        tileFuture.set(buildTileContent(receivedData))
    }
    
    return tileFuture
}

// buildTileContent方法同方案1

关键注意事项

  • 确保你的TileService已在AndroidManifest.xml中正确注册:
<service
    android:name=".YourTileService"
    android:exported="true"
    android:permission="com.google.android.wearable.permission.BIND_TILE_PROVIDER">
    <intent-filter>
        <action android:name="androidx.wear.tiles.action.BIND_TILE_PROVIDER" />
    </intent-filter>
</service>
  • 触发Tile更新时,必须传入你自定义的TileService类,系统才会通知对应Tile刷新。

内容的提问来源于stack exchange,提问作者dect

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:45:59