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

能否在CoroutinesTileService中使用Room数据库开发穿戴设备Tile?

在CoroutinesTileService中使用Room数据库的实现方案

1. 初始化Room实例

首先确保你的Room数据库实现单例模式,避免重复创建实例:

@Database(entities = [ActivityData::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun activityDao(): ActivityDao

    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        fun getInstance(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "activity_db"
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}

在CoroutinesTileService的onCreate方法中获取数据库和DAO实例:

class ActivityTileService : CoroutinesTileService() {
    private lateinit var activityDao: ActivityDao

    override fun onCreate() {
        super.onCreate()
        val db = AppDatabase.getInstance(applicationContext)
        activityDao = db.activityDao()
    }
}

2. 在协程中执行Room数据操作

CoroutinesTileService的onTileRequest是挂起函数,直接调用DAO的挂起方法即可(需确保DAO方法用suspend修饰):

// DAO定义挂起查询方法
@Dao
interface ActivityDao {
    @Query("SELECT * FROM activity_data WHERE date = :today")
    suspend fun getTodayActivity(today: String = LocalDate.now().toString()): ActivityData
}

在Tile请求中获取数据并构建UI:

override suspend fun onTileRequest(requestParams: RequestParams): Tile {
    val todayData = activityDao.getTodayActivity()
    val progress = todayData.completedCount.toFloat() / todayData.dailyTarget.toFloat()

    return Tile.Builder()
        .setResourcesVersion("1")
        .setTimeline(
            Timeline.Builder()
                .addTimelineEntry(
                    TimelineEntry.Builder()
                        .setLayout(
                            Layout.Builder()
                                .setComposableContent {
                                    // 用Compose绘制进度UI
                                    Column(
                                        modifier = Modifier.fillMaxSize(),
                                        horizontalAlignment = Alignment.CenterHorizontally,
                                        verticalArrangement = Arrangement.Center
                                    ) {
                                        CircularProgressIndicator(
                                            progress = progress,
                                            modifier = Modifier.size(48.dp)
                                        )
                                        Spacer(modifier = Modifier.height(8.dp))
                                        Text(text = "${(progress * 100).toInt()}%")
                                    }
                                }
                                .build()
                        )
                        .build()
                )
                .build()
        )
        .build()
}

3. 数据更新时主动刷新Tile

当Room中的活动数据变化时,需要触发Tile更新:

  • 在数据修改的代码位置(如ViewModel、Repository)调用:
TileService.requestTileUpdate(context, ActivityTileService::class.java)
  • 或在TileService中用Flow监听数据变化,自动刷新:
override fun onCreate() {
    super.onCreate()
    val db = AppDatabase.getInstance(applicationContext)
    activityDao = db.activityDao()

    lifecycleScope.launch {
        activityDao.observeTodayActivity().collect {
            requestTileUpdate()
        }
    }
}

// DAO添加Flow观察方法
@Query("SELECT * FROM activity_data WHERE date = :today")
fun observeTodayActivity(today: String = LocalDate.now().toString()): Flow<ActivityData>

4. Tile中展示图表的优化建议

  • 智能手表Tile空间有限,优先选择简化可视化组件:环形进度条、线性进度条,避免复杂柱状/折线图
  • 提前在Repository或ViewModel中计算好进度值,Tile中只负责渲染,减少计算开销
  • 用Compose的Canvas自定义绘制极简图表时,控制绘制复杂度,保证Tile加载流畅

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:38:24