Android7.08.0 电池图标分析
这里只是简单的介绍下电池图标的显示,所以不是全面的电池分析。想做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 电池图标分析相关推荐
- Android6.0电池图标外显示电量百分比
众所周知Android6.0进入界面后电池电量百分比被隐藏进了调谐者模式里面,即使打开调谐者模式显示电量数字也在电池图标里,对于某些习惯于5.1电量显示的人来说这是一个很难受的事情,那么这里我来提供一 ...
- android okgo跳过https验证,okgo下载文件,apk安装适配android7.08.0
本文基于OKGO3.0.4版本编写 首先导入依赖 implementation 'com.lzy.net:okgo:3.0.4' 一.okgo跳过https验证 1.导入自定义SSLSocketCli ...
- Android7.08.0 默认壁纸修改
1.拷贝自定义壁纸 默认壁纸是default_wallpaper,在/frameworks/base/core/res下面.找到所以的default_wallpaper所在的地方,然后把我们自己的壁 ...
- JavaScript中的ParseInt(08)和“09”返回0的原因分析及解决办法
今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...
- 0.96OLED图标取模,包括信号图标,蓝牙图标,闹钟,电池
/*信号蓝牙闹钟电池组合图片*/ unsigned char BMP2[] = {0x00,0x03,0x05,0x09,0x11,0xFF,0x11,0x89,0x05,0xC3,0x00,0xE0 ...
- android 电量管理机制,电池电量分析---android篇
原标题:电池电量分析---android篇 本文将从底层到上层介绍Android系统中电量显示这一块,电池检测采用的是ADC采样,不是使用市场上封装好的电量计芯片: 1.驱动层 Linux内核中提供p ...
- 基于Android Q电池服务分析
基于Android Q的电池服务分析之充电类型判断 开局先说明一下我的需求和我遇到的难题 问题 插入充电没有提示音和图标更新 插入充电没有任何反应和提示,但是确实是在充电 需求 在设置的电池中增加充电 ...
- lenovo vantage工具栏无反应 电池图标单击无法显示状态栏
正常情况下,单击电池图标,如下显示: 在某些版本更新情况下,单击电池图标无反应,解决方案如下: 1.卸载Lenovo Vantage和Lenovo System Interface Foundatio ...
- 假设用于通信的电文由字符集{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. ...
最新文章
- breakdancer检测结构变异
- ZOJ 2913 Bus Pass (近期的最远BFS HDU2377)
- mysql主从配置 ssl_Mysql主从基本配置及基于ssl的配置详解
- android注解的作用,Android 用注解来提升代码质量
- 使用 Python 5 年后,我转向了Go
- AngularJS(1)——入门学习
- 【转】AI-900认证考试攻略
- 测试动态视力软件叫什么影响吗,动态视力
- linux搭建redis
- C# 入门笔记(脚本)
- 程序员面试 IT 公司,这些细节一定要注意!
- ctf线下赛mysql密码_CTF线下攻防赛
- iOS开发之WKWebview(淘宝链接不自动打开淘宝和天猫的app)
- IOS开发之页面跳转
- mysql简单的数据提取代码_MYSQL提取非常简单的数据,chrome浏览器响应过长,如何优化?...
- 联想计算机无线网络设置密码,联想(Lenovo)路由器怎么设置密码?
- PHP编译安装常见错误解决
- 股票市场交易中的强化学习
- 用 texstudio, 外部 pdf 浏览器查看可以正常显示中文, 但是内置的 pdf 浏览器不能显示中文?
- 旅游类APP-环境搭建
热门文章
- 运放电路的工作原理_一文教你巧识滤波、稳压、比较、运放电路
- 旅游类App原型制作分享-Triposo
- 产品经理的六大工作职责——最简洁
- Linux——SAMBA文件共享
- 打印一本200页的书要多少钱?
- VS (Visual Studio) 魔兽插件开发工具 AddOn Studio for WOW 1.0 含有LUA编辑
- 做柜员还是程序员_放弃月薪2万的程序员,被爸妈喊回家干公务员,看到工资悔不当初...
- python listdir 忽略 隐藏文件_忽略特殊文件
- 记一次海康威视笔试题小练手
- 欧拉定理及费马小定理