Android 13中状态栏电池图标信息更新流程

news/2025/2/21 10:42:09/
  1. 更新总流程

状态栏电池图标更新总流程如下(以更新电池电量为例):

BatteryControllerImpl.onReceive -> fireBatteryLevelChanged -> BatteryMeterViewController.onBatteryLevelChanged

->BatteryMeterView.onBatteryLevelChanged -> ThemedBatteryDrawable.setBatteryLevel -> invalidateSelf

首先由BatteryControllerImpl接收广播(主要有ACTION_BATTERY_CHANGED、ACTION_POWER_SAVE_MODE_CHANGED等)去更新电池相关信息,如

电量、充电速度、充电状态、省电模式等信息。然后将接收到的信息通过回调callback更新至电池图标上,即BatterMeterView中。最后BatteryMeterView将

接收到的信息更新至电池图标对应的drawable(ThemedBatteryDrawable),后者更新信息后进行刷新,从而达到更新电池图标的目标。

  1. 注意

BatteryControllerImpl回调callback将充电信息更新至BatteryMeterViewController时,后者实际上只使用了level和pluggedIn这两个参数。充电信息更新至

BatteryMeterView中时,可以看到是否处于充电状态取决于pluggedIn。所以可能会出现哪怕是已经充满了电、或者只是插入了otg,图标也会显示正在充电的

情况。

SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java

402 protected void fireBatteryLevelChanged() {

403 synchronized (mChangeCallbacks) {

404 final int N = mChangeCallbacks.size();

405 for (int i = 0; i < N; i++) {

更新充电参数:mLevel, mPluggedIn, mCharging

406 mChangeCallbacks.get(i).onBatteryLevelChanged(mLevel, mPluggedIn, mCharging);

407 }

408 }

409 }

SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java

71 private final BatteryController.BatteryStateChangeCallback mBatteryStateChangeCallback =

72 new BatteryController.BatteryStateChangeCallback() {

73 @Override

74 public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {

将level和pluggedIn更新至BatteryMeterView

75 mView.onBatteryLevelChanged(level, pluggedIn);

76 }

SystemUI/src/com/android/systemui/battery/BatteryMeterView.java

195 void onBatteryLevelChanged(int level, boolean pluggedIn) {

charging取决于pluggedIn

196 mDrawable.setCharging(pluggedIn);

197 mDrawable.setChargingSpeed(mChargingSpeed); // UNISOC: Modify for bug 1838475

198 mDrawable.setBatteryLevel(level);

  1. 排查

如果状态栏电池图标信息显示有误,比如电量、充电状态等,可按更新流程进行排查。

3.1 排查BatteryControllerImpl是否有接收到对应广播去更新充电信息

SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java

198 @Override

199 public void onReceive(final Context context, Intent intent) {

200 final String action = intent.getAction();

201 if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {

根据广播更新充电信息

202 if (mTestMode && !intent.getBooleanExtra(“testmode”, false)) return;

203 mHasReceivedBattery = true;

204 mLevel = (int)(100f

205 * intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)

206 / intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100));

207 mPluggedIn = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;

208 mPluggedInWireless = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0)

209 == BatteryManager.BATTERY_PLUGGED_WIRELESS;

210

211 final int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS,

212 BatteryManager.BATTERY_STATUS_UNKNOWN);

213 mCharged = status == BatteryManager.BATTERY_STATUS_FULL;

214 mCharging = mCharged || status == BatteryManager.BATTERY_STATUS_CHARGING;

230 final BatteryStatus batteryStatus = new BatteryStatus(intent);

231 int chargingSpeed = batteryStatus.getChargingSpeed(context);

3.2 排查BatteryMeterViewController中实现的对应callback是否有被回调

SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java

71 private final BatteryController.BatteryStateChangeCallback mBatteryStateChangeCallback =

72 new BatteryController.BatteryStateChangeCallback() {

73 @Override

74 public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {

更新电量、充电状态

75 mView.onBatteryLevelChanged(level, pluggedIn);

76 }

77

78 /* UNISOC: Modify for bug 1838475 @{ */

79 @Override

80 public void onChargingSpeedChanged(int chargingSpeed) {

更新充电速度

81 mView.onChargingSpeedChanged(chargingSpeed);

82 }

83 /* @} */

84

85 @Override

86 public void onPowerSaveChanged(boolean isPowerSave) {

更新省电模式

87 mView.onPowerSaveChanged(isPowerSave);

88 }

89

90 @Override

91 public void onBatteryUnknownStateChanged(boolean isUnknown) {

更新电池unKnown状态

92 mView.onBatteryUnknownStateChanged(isUnknown);

93 }

94 };

3.3 排查电池信息是否有更新至BatteryMeterView,并提交更新至drawable中

SystemUI/src/com/android/systemui/battery/BatteryMeterView.java

195 void onBatteryLevelChanged(int level, boolean pluggedIn) {

drawable中更新充电状态

196 mDrawable.setCharging(pluggedIn);

drawable中更新充电速度

197 mDrawable.setChargingSpeed(mChargingSpeed); // UNISOC: Modify for bug 1838475

drawable中更新充电电量

198 mDrawable.setBatteryLevel(level);

199 mCharging = pluggedIn;

200 mLevel = level;

更新电量百分比

201 updatePercentText();

202 }


http://www.ppmy.cn/news/853563.html

相关文章

Minecraft 1.12.2模组开发(三十七) 3D盔甲

有小伙伴询问如何在模组中制作3D的盔甲并实装&#xff0c;那么我们今天就来做一件3D的盔甲 首先建议回顾一下之前关于盔甲的教程Minecraft 1.12.2模组开发(八) 盔甲套装 1.首先我们需要制作一套盔甲和盔甲穿在身上的贴图&#xff0c;可以使用blockbench进行制作&#xff1a; …

朗读者转换后出现异常

《小说朗读器》主要功能基本全了&#xff0c;最近一直在处理朗读者转换后出现异常的问题&#xff1a;转换成非微软的朗读者时&#xff0c;有时会不停的下一句跳动却不发音。 非微软的朗读者采用的《朗读女》中的VW Hui、VW Lily&#xff0c;有时正常朗读&#xff0c;有时不正常…

“朗读女”软件插入耳机后依然公放的解决办法

虽然其他设备都是选择默认通道输出声音&#xff0c;但朗读女还是用的系统扬声器公放&#xff0c;原理就是把输出设备设置成只有耳机输出。 1.右键任务栏的喇叭&#xff0c;选择“声音&#xff08;S&#xff09;”&#xff0c;打开声音设置 2.然后选择“播放”这个标签 3.把除…

普通话水平测试录音软件,普通话水平测试朗读作品示范录音

普通话水平测试朗读作品示范录音 应试人在运用普通话口语进行表达过程中所表现的语音、词汇、语法规范程度&#xff0c;是评定其所达到的水平等级的重要依据。以下是百分网小编整理的普通话水平测试朗读作品示范录音&#xff0c;欢迎学习! 【篇一】风筝畅想曲 假日到河滩上转转…

python在线朗读-简单的python代码实现语音朗读

简单的python代码实现语音朗读 昨天女友生日&#xff0c;因为她一直对生日无感&#xff0c;所以我也就没有准备什么礼物。想起元旦前写的自动测试的脚本&#xff0c;添加了语音来提示测试和报告错误。灵机一动&#xff0c;为什么不用这个语音来庆祝她生日快乐呢&#xff1f; 简…

python朗读网页-手把手教你用 Python 来朗读网页

是不是有的时候懒得自己看新闻&#xff1f;那么不妨试试用 Python 来朗读给你听吧。 网页转换成语音&#xff0c;步骤无外乎&#xff1a; 网页正文识别&#xff0c;获取到正文的文本内容&#xff1b; 文本转语音&#xff0c;通过接口将文本转换成语音文件&#xff1b; 语音…

python 语音朗读-简单的python代码实现语音朗读

简单的python代码实现语音朗读 昨天女友生日&#xff0c;因为她一直对生日无感&#xff0c;所以我也就没有准备什么礼物。想起元旦前写的自动测试的脚本&#xff0c;添加了语音来提示测试和报告错误。灵机一动&#xff0c;为什么不用这个语音来庆祝她生日快乐呢&#xff1f; 简…

Python pyttsx3|文本朗读(各种语言)

Python文字转语音 程序员&#xff0c;在其他人眼中往往都是高冷的存在&#xff0c;在他们的眼中能用代码解决的问题绝对不考虑其他的方法&#xff0c;本文让我们用Python来提升一下高冷的档次&#xff0c;让我们用代码来“说话”。 安装pyttsx3 安装 下面就让我们来看一下P…