uni-app需手写平台分支轮询:Android用setInterval定时通过plus.android.registerReceiver读取ACTION_BATTERY_CHANGED广播的level/scale计算电量,间隔≥5秒并清内存;iOS必须提前启用batteryMonitoring并轮询batteryLevel,真机验证且后台失效。
uni-app 没有内置的、跨平台的电池电量变化监听 api;你必须自己实现定时轮询 + 平台分支逻辑,且 ios 无法真正“监听”,只能轮询读取。
Android 怎么轮询获取电量变化
Android 系统不提供 BatteryManager 的实时回调接口,ACTION_BATTERY_CHANGED 是 sticky broadcast,只适合单次快照读取,不能持续监听。所以实际做法是用 setInterval 定时调用广播读取逻辑:
- 每次调用都需重新注册 receiver(传
null即可),不能复用旧实例 - 必须同时读取
level和scale,单独读level在部分机型返回 -1 - 推荐间隔 ≥ 5 秒——太密会增加 CPU 唤醒次数,反而耗电
- 记得在页面卸载时
clearInterval,否则内存泄漏
示例关键片段:
let batteryTimer = null
function startBatteryPolling() {
batteryTimer = setInterval(() => {
const Intent = plus.android.importClass('android.content.Intent')
const filter = new plus.android.importClass('android.content.IntentFilter')(Intent.ACTION_BATTERY_CHANGED)
const receiver = plus.android.runtimeMainActivity().registerReceiver(null, filter)
const level = plus.android.invoke(receiver, 'getIntExtra', 'level', -1)
const scale = plus.android.invoke(receiver, 'getIntExtra', 'scale', -1)
if (level > 0 && scale > 0) {
const percent = Math.floor((level / scale) * 100)
console.log('电量:', percent + '%')
// 触发自定义事件或更新 data
}
}, 5000)
}
iOS 为什么不能监听,只能轮询
iOS 的 UIDevice.batteryLevel 是只读属性,且默认关闭监控——调用 setBatteryMonitoringEnabled(true) 后也只是“允许读取”,系统不会主动推送变化。更关键的是:
- 后台状态下该值不再刷新,即使 App 还在运行,
batteryLevel也会卡住 - 模拟器永远返回
-1.0,真机调试是唯一验证方式 - 没有原生 API 获取充电状态变更(如插拔 USB),
batteryState()返回整数但文档未公开枚举含义,实测 2/3 表示充电中,但不可靠
所以轮询是唯一选择,且建议加防抖:
function pollIOSBattery() {
const UIDevice = plus.ios.importClass('UIDevice')
const dev = UIDevice.currentDevice()
if (!dev.isBatteryMonitoringEnabled()) {
dev.setBatteryMonitoringEnabled(true)
}
const level = dev.batteryLevel()
if (level >= 0) {
const percent = Math.round(level * 100)
console.log('电量:', percent + '%')
}
}
// 同样用 setInterval,但首次调用前必须确保 setBatteryMonitoringEnabled 已执行
Vue2 项目千万别用 uni.getBatteryInfo
截至 2026 年 5 月,uni.getBatteryInfo 仍被官方标注为「仅 Vue3 支持」。Vue2 项目中调用它:
- 开发环境可能 mock 成功,但打包后 Android 直接静默失败,iOS 返回
errCode: 1002 - 控制台无报错,
success和fail回调都不触发,极难排查 - 插件市场里的
uni-getbatteryinfo插件编译不过,HBuilderX 报uts插件[...]编译失败
真实可行路径只有一条:用 plus.android / plus.ios 手写平台判断 + 轮询逻辑,并严格按平台加权限、启监控、真机测。
容易被忽略的关键点
轮询不是“写个定时器就完事”。Android 必须在 manifest.json 的 Android 权限配置里勾选 android.permission.BATTERY_STATS,否则真机上 registerReceiver 可能返回 null 导致后续调用崩溃;iOS 必须在 App 启动早期(比如 main.js 或首页 onLoad)就调用 setBatteryMonitoringEnabled(true),晚了就永远拿不到有效值——这个设置不可逆,但只做一次就够了。


















