这里只是简单的介绍下电池图标的显示,所以不是全面的电池分析。想做frameworks电池图标定制的可以参考下。

frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java,这个类就是用来显示电池图标的,它继承ImageView,构造函数中就会去设置图片,也就是电池图标。setImageDrawable(mDrawable) 就是设置的电池图标。

    public BatteryMeterView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);TypedArray atts = context.obtainStyledAttributes(attrs, R.styleable.BatteryMeterView,defStyle, 0);final int frameColor = atts.getColor(R.styleable.BatteryMeterView_frameColor,context.getColor(R.color.batterymeter_frame_color));mDrawable = new BatteryMeterDrawable(context, new Handler(), frameColor);atts.recycle();mSlotBattery = context.getString(com.android.internal.R.string.status_bar_battery);setImageDrawable(mDrawable);}

frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java是一个Drawable,用来画电池图标,它实现了BatteryController.BatteryStateChangeCallback这个接口,用来跟新电池图标,当电池发生变化的时候,就去刷新下Drawable。

    @Overridepublic void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {mLevel = level;mPluggedIn = pluggedIn;postInvalidate();}private void postInvalidate() {mHandler.post(new Runnable() {@Overridepublic void run() {invalidateSelf();}});}

下面看下frameworks/base/packages/SystemUI/src/com/android/systemui/policy/BatteryControllerImpl.java这个类,它实现了接口BatteryController,BatteryControllerImpl它会添加所有BatteryController.BatteryStateChangeCallback

@Overridepublic void addStateChangedCallback(BatteryController.BatteryStateChangeCallback cb) {synchronized (mChangeCallbacks) {mChangeCallbacks.add(cb);}if (!mHasReceivedBattery) return;cb.onBatteryLevelChanged(mLevel, mPluggedIn, mCharging);cb.onPowerSaveChanged(mPowerSave);}

然后去监听电池变化,当电池发生变化时,就去循环调用所以的BatteryController.BatteryStateChangeCallback。

    @Overridepublic void onReceive(final Context context, Intent intent) {final String action = intent.getAction();if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {if (mTestmode && !intent.getBooleanExtra("testmode", false)) return;mHasReceivedBattery = true;mLevel = (int)(100f* intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)/ intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100));mPluggedIn = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;final int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS,BatteryManager.BATTERY_STATUS_UNKNOWN);mCharged = status == BatteryManager.BATTERY_STATUS_FULL;mCharging = mCharged || status == BatteryManager.BATTERY_STATUS_CHARGING;fireBatteryLevelChanged();} else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)) {updatePowerSave();} else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING)) {setPowerSave(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));} else if (action.equals(ACTION_LEVEL_TEST)) {mTestmode = true;mHandler.post(new Runnable() {int curLevel = 0;int incr = 1;int saveLevel = mLevel;boolean savePlugged = mPluggedIn;Intent dummy = new Intent(Intent.ACTION_BATTERY_CHANGED);@Overridepublic void run() {if (curLevel < 0) {mTestmode = false;dummy.putExtra("level", saveLevel);dummy.putExtra("plugged", savePlugged);dummy.putExtra("testmode", false);} else {dummy.putExtra("level", curLevel);dummy.putExtra("plugged", incr > 0 ? BatteryManager.BATTERY_PLUGGED_AC: 0);dummy.putExtra("testmode", true);}context.sendBroadcast(dummy);if (!mTestmode) return;curLevel += incr;if (curLevel == 100) {incr *= -1;}mHandler.postDelayed(this, 200);}});}}protected void fireBatteryLevelChanged() {synchronized (mChangeCallbacks) {final int N = mChangeCallbacks.size();for (int i = 0; i < N; i++) {mChangeCallbacks.get(i).onBatteryLevelChanged(mLevel, mPluggedIn, mCharging);}}}

所以当电池发生变化的时候,所有实现了BatteryController.BatteryStateChangeCallback回调的地方都会被调用,执行onBatteryLevelChanged和onPowerSaveChanged。

Android7.08.0 电池图标分析相关推荐

  1. Android6.0电池图标外显示电量百分比

    众所周知Android6.0进入界面后电池电量百分比被隐藏进了调谐者模式里面,即使打开调谐者模式显示电量数字也在电池图标里,对于某些习惯于5.1电量显示的人来说这是一个很难受的事情,那么这里我来提供一 ...

  2. android okgo跳过https验证,okgo下载文件,apk安装适配android7.08.0

    本文基于OKGO3.0.4版本编写 首先导入依赖 implementation 'com.lzy.net:okgo:3.0.4' 一.okgo跳过https验证 1.导入自定义SSLSocketCli ...

  3. Android7.08.0 默认壁纸修改

    1.拷贝自定义壁纸  默认壁纸是default_wallpaper,在/frameworks/base/core/res下面.找到所以的default_wallpaper所在的地方,然后把我们自己的壁 ...

  4. JavaScript中的ParseInt(08)和“09”返回0的原因分析及解决办法

    今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...

  5. 0.96OLED图标取模,包括信号图标,蓝牙图标,闹钟,电池

    /*信号蓝牙闹钟电池组合图片*/ unsigned char BMP2[] = {0x00,0x03,0x05,0x09,0x11,0xFF,0x11,0x89,0x05,0xC3,0x00,0xE0 ...

  6. android 电量管理机制,电池电量分析---android篇

    原标题:电池电量分析---android篇 本文将从底层到上层介绍Android系统中电量显示这一块,电池检测采用的是ADC采样,不是使用市场上封装好的电量计芯片: 1.驱动层 Linux内核中提供p ...

  7. 基于Android Q电池服务分析

    基于Android Q的电池服务分析之充电类型判断 开局先说明一下我的需求和我遇到的难题 问题 插入充电没有提示音和图标更新 插入充电没有任何反应和提示,但是确实是在充电 需求 在设置的电池中增加充电 ...

  8. lenovo vantage工具栏无反应 电池图标单击无法显示状态栏

    正常情况下,单击电池图标,如下显示: 在某些版本更新情况下,单击电池图标无反应,解决方案如下: 1.卸载Lenovo Vantage和Lenovo System Interface Foundatio ...

  9. 假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成。 它们在电文中出现的频度分别为{0.31,0.16,0.10,0.08,0.11,0.20,0.04}。【MOOC答案】

    目   录 1.题目 2.答案and详细题解过程 1)为这7个字母设计哈夫曼编码: 1.1.答案 1.2.详细题解过程 2)为这7个字母设计等长编码,至少需要几位二进制数?[3位] 2.1.答案 2. ...

最新文章

  1. breakdancer检测结构变异
  2. ZOJ 2913 Bus Pass (近期的最远BFS HDU2377)
  3. mysql主从配置 ssl_Mysql主从基本配置及基于ssl的配置详解
  4. android注解的作用,Android 用注解来提升代码质量
  5. 使用 Python 5 年后,我转向了Go
  6. AngularJS(1)——入门学习
  7. 【转】AI-900认证考试攻略
  8. 测试动态视力软件叫什么影响吗,动态视力
  9. linux搭建redis
  10. C# 入门笔记(脚本)
  11. 程序员面试 IT 公司,这些细节一定要注意!
  12. ctf线下赛mysql密码_CTF线下攻防赛
  13. iOS开发之WKWebview(淘宝链接不自动打开淘宝和天猫的app)
  14. IOS开发之页面跳转
  15. mysql简单的数据提取代码_MYSQL提取非常简单的数据,chrome浏览器响应过长,如何优化?...
  16. 联想计算机无线网络设置密码,联想(Lenovo)路由器怎么设置密码?
  17. PHP编译安装常见错误解决
  18. 股票市场交易中的强化学习
  19. 用 texstudio, 外部 pdf 浏览器查看可以正常显示中文, 但是内置的 pdf 浏览器不能显示中文?
  20. 旅游类APP-环境搭建

热门文章

  1. 运放电路的工作原理_一文教你巧识滤波、稳压、比较、运放电路
  2. 旅游类App原型制作分享-Triposo
  3. 产品经理的六大工作职责——最简洁
  4. Linux——SAMBA文件共享
  5. 打印一本200页的书要多少钱?
  6. VS (Visual Studio) 魔兽插件开发工具 AddOn Studio for WOW 1.0 含有LUA编辑
  7. 做柜员还是程序员_放弃月薪2万的程序员,被爸妈喊回家干公务员,看到工资悔不当初...
  8. python listdir 忽略 隐藏文件_忽略特殊文件
  9. 记一次海康威视笔试题小练手
  10. 欧拉定理及费马小定理