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

手表表盘电池电量无法实时更新问题技术求助

解决手表表盘电池电量不更新的问题

看起来你遇到的问题很典型——表盘只在初始化时获取一次电量,之后既没监听电量变化,也没触发重绘更新显示。别担心,咱们一步步来修复:

核心问题分析

你的表盘目前应该只在某个初始化方法(比如onCreate或onSurfaceCreated)里获取了一次电量,但没有监听系统的电量变化广播,也没有在电量改变时通知表盘重绘,所以后续电量更新无法同步到界面上。

具体修复步骤

1. 定义电量变化广播接收器

在你的Engine类内部,添加一个广播接收器,专门用来监听系统的电量变化通知:

private val batteryUpdateReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        intent?.takeIf { it.action == Intent.ACTION_BATTERY_CHANGED }?.let {
            // 计算当前电量百分比
            val batteryLevel = it.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
            val batteryScale = it.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
            val currentBatteryPercent = if (batteryScale > 0) (batteryLevel * 100) / batteryScale else 0
            
            // 更新Engine类中保存电量的成员变量(记得先定义:var mBatteryPercent = 0)
            mBatteryPercent = currentBatteryPercent
            
            // 通知表盘重绘,让新电量显示出来
            invalidate()
        }
    }
}

2. 按需注册/注销接收器

为了避免后台耗电,我们只在表盘可见时注册接收器,不可见时立即注销。在Engine的onVisibilityChanged方法里补充逻辑:

override fun onVisibilityChanged(visible: Boolean) {
    super.onVisibilityChanged(visible)
    val batteryFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED)
    
    if (visible) {
        // 注册接收器,开始监听电量变化
        context.registerReceiver(batteryUpdateReceiver, batteryFilter)
        
        // 主动获取一次当前电量,确保表盘刚显示时就是最新值
        val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager
        mBatteryPercent = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
        invalidate()
    } else {
        // 注销接收器,避免后台耗电
        try {
            context.unregisterReceiver(batteryUpdateReceiver)
        } catch (e: IllegalArgumentException) {
            // 如果接收器未注册,忽略该异常即可
        }
    }
}

3. 绘制时使用最新电量变量

在你的onDraw方法里,直接使用mBatteryPercent变量来绘制电量,而不是每次绘制都重新获取(单次获取不会自动更新)。

额外注意事项

  • 无需额外权限:ACTION_BATTERY_CHANGED是系统主动推送的广播,不需要在Manifest中申请权限就能接收。
  • 异常处理:注销接收器时可能因未注册抛出异常,所以要加try-catch避免崩溃。

这样修改后,你的表盘就能实时接收电量变化通知,自动重绘显示最新电量了~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:39:57