Android 5.1 - 状态栏充电标志问题

Android 5.1 Ubuntu14.04  SourceInsigh

电量已满,插着USB头,观察Settings - Battery,电量为100%,状态为full,但仍有充电图标rust

之前有读过关于StatusBar的代码。这次直接用SourceInsight找到 StatusBarHeaderView.java  

里面关于电池的方法有

    @Override     public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {         String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);         mBatteryLevel.setText(percentage);     }

似乎没什么帮助,我们找的是图标,不是数字

猜测一下,电池状态变化的时候,肯定会发出通知,十有八九是用广播发出的

用SourceInsight直接搜索battery,搜到关于Battery的一些文件

/** BatteryManager.java (base/core/java/android/os)*/     // values for "status" field in the ACTION_BATTERY_CHANGED Intent     public static final int BATTERY_STATUS_FULL = 5;    // 定义了状态值

在 BatteryService.java 中,可以发现一个获取icon的方法

/** BatteryService.java (base/services/core/java/com/android/server) */ private int getIconLocked(int level) {         if (mBatteryProps.batteryStatus == BatteryManager.BATTERY_STATUS_CHARGING) {             return com.android.internal.R.drawable.stat_sys_battery_charge; ......

根据stat_sys_battery_charge,可以找到 Stat_sys_battery_charge.xml  (framework/base/core/res/res/drawable)

find一下就能值得图标存放在frameworks/base/core/res/res/drawable-mdpi/ 等目录下

 

修改 BatteryService.java  getIconLocked中的判断条件或返回值

找到了很多资源文件,修改一下返回值。比如:

if (mBatteryProps.batteryStatus == BatteryManager.BATTERY_STATUS_CHARGING) {             return com.android.internal.R.drawable.stat_sys_battery;    // 显示未充电的图标

编译后push进去,发现没效果

不成功,为何?发出的广播没有人接收?icon被塞进了 BatteryManager.EXTRA_ICON_SMALL

int icon = getIconLocked(mBatteryProps.batteryLevel); intent.putExtra(BatteryManager.EXTRA_ICON_SMALL, icon);

grep一下EXTRA_ICON_SMALL,发现没地方接收。发出的广播没人收,那电池图标rust是怎么放上去的?

 

换一个寻找思路

我知道状态栏属于SystemUI,观察SystemUI的文件目录;打开 AndroidManifest.xml 看到

<service android:name="SystemUIService" android:exported="true"/>

接下来找到并打开 SystemUIService.java ;在onCreate()中提到了SystemUIApplication

 SystemUIApplication.java 里启动了一系列的服务,其中就包括

com.android.systemui.statusbar.SystemBars.class

打开 SystemBars.java  frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar

可以看到BaseStatusBar

 mStatusBar = (BaseStatusBar) cls.newInstance(); 

顺藤摸瓜

在 BaseStatusBar.java 中搜索R.layout,却只找到notification相关的

BaseStatusBar是基础状态栏的意思,会不会有别的类来继承它?grep一下发现

TvStatusBar和PhoneStatusBar继承自BaseStatusBar

在 PhoneStatusBar.java 中搜索“R.layout.”,得到几个layout:

R.layout.super_status_bar

R.layout.heads_up

R.layout.navigation_bar

R.layout.status_bar_notification_keyguard_overflow 等等

mStatusBarWindow = (StatusBarWindowView) View.inflate(context,                 R.layout.super_status_bar, null);

重点关注一下super_status_bar,里面装载了很多子布局,比如status_bar

打开 status_bar.xml  ,找到system_icon_area;它include了system_icons

打开 system_icons.xml 我们发现,有一个自定义控件com.android.systemui.BatteryMeterView

现在知道电池图标是画出来的了

//BatteryMeterView.java (framework/base/packages/systemui/src/com/android/systemui) public class BatteryMeterView extends View implements DemoMode,         BatteryController.BatteryStateChangeCallback

实现了BatteryController.BatteryStateChangeCallback接口,电池状态改变,电池图标会更新

private class BatteryTracker extends BroadcastReceiver {

接收广播,取出电池各项信息;得到电池信息要更新图标

观察draw方法,里面有用tracker来进行判断

        if (tracker.plugged) {             // define the bolt shape

如果插上了USB头,就画出闪电标志;我们的要求是充电状态下才能有闪电标志

那么多加入一个判断,当充满电的时候,不要画闪电标志

        if (tracker.plugged && (batteryStatus != BatteryManager.BATTERY_STATUS_FULL)) {             // define the bolt shape

batteryStatus是rust自行定义的int变量,从BatteryTracker中取出电池status,再用来判断

重新编译烧写,发现充满电后,无充电标志

原来充电的标志rust是画上去的。

转载于:https://www.cnblogs.com/muhuacat/p/5613400.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kail中tools的安装和第一个php学习笔记

安装tools 打开 鼠标右击选择 创建文件夹 mkdir cdrom 把tools文件复制到 位置——计算机——cdrom文件夹下 打开 cdrom cd cdrom 复制生成的目录 解压文件夹&#xff1a;tar zxvf 粘贴目录 回车 ls 复制目录 cd 粘贴目录 ls 复制后缀为pl的目录 ./粘贴目录.d自动下载 Enjoy代表…

面试进阶题集锦-持续更新

面向对象的”六原则一法则” - 单一职责原则&#xff1a;一个类只做它该做的事情。&#xff08;单一职责原则想表达的就是”高内聚”&#xff0c;写代码最终极的原则只有六个字”高内聚、低耦合”&#xff0c;所谓的高内聚就是一个代码模块只完成一项功能&#xff0c;在面向对象…

透明(颜色)渐变背景(颜色透明背景),兼容IE8

filter: progid:DXImageTransform.Microsoft.gradient (GradientType0, startColorstr#00000000, endColorstr#cc000000); -ms-filter: "progid:DXImageTransform.Microsoft.gradient (GradientType0, startColorstr#00000000, endColorstr#cc000000)";一般用filter就…

python pip本地安装包_python-pip install 安装包

python-pip install 安装包国内安装python包&#xff0c;有时会因为网络问题&#xff0c;导致package安装失败&#xff0c;so,换一种方法解决&#xff1b;pip install package_name;(直接安装&#xff1b;推荐使用&#xff0c;但因网络问题&#xff0c;有时安装失败)pip instal…

【CDN】域名无法访问,ping不到,tracert不到

背景&#xff1a;香港服务器&#xff0c;CDN服务商&#xff1a;Incapsula 1、首先猜测&#xff0c;域名是否被墙 原因&#xff1a;ip可以直接访问到网站&#xff0c;其他域名指向服务器也可访问 排查&#xff1a;1&#xff09;首先理解&#xff0c;怎样才算被墙&#xff1a;大陆…

python 库整理_自己整理的PYTHON库

1、操作Excel1)Pylightxl地址&#xff1a;https://pypi.org/project/pylightxl文档&#xff1a;https://pylightxl.readthedocs.io/en/latest/2)Openpyxl地址&#xff1a;https://pypi.org/project/openpyxl/文档&#xff1a;https://openpyxl.readthedocs.io/en/stable/2、操作…

PHP发送邮件

先看一下HTML如何发送邮件 HTML发送邮件首先得使用超链接标签<a> 之后使用mailto:链接收件人邮件地址 用bcc链接发件人邮箱&#xff08;加密抄送&#xff0c;cc为直接抄送&#xff09; mailto 和bcc/cc之间用?连接 subject邮件主题&#xff0c;body邮件内容&#xff0…

node.js 实现扫码二维码登录

最近在做一个扫码登录功能&#xff0c;为此我还在网上搜了一下关于微信的扫描登录的实现方式。当这个功能完成了后&#xff0c;我决定将整个实现思路整理出来&#xff0c;方便自己以后查看也方便其他有类似需求的程序猿些。 要实现扫码登录我们需要解决两个问题&#xff1a; 1.…

喇叭正反相位测试音频_FIR滤波器能给音频扩声带来怎样的帮助?

随着数字音频的快速发展&#xff0c;近些年在音频扩声领域&#xff0c;经常能听到音频技术人士讨论FIR数字滤波器&#xff0c;有些说法和厂家的宣传难免有些过于神化&#xff0c;有些厂家的技术工程师竟然宣称&#xff0c;自己的FIR滤波器能把每只扬声器或者整组扩声系统的相位…

使用c语言easy—x库实现实时钟表

先了解一下easy-x库 EasyX 是针对 C 的图形库&#xff0c;可以帮助 C语言初学者快速上手图形和游戏编程。 可以通过官网下载&#xff0c;文件很小&#xff0c; easy-x的支持头文件是 #include<graphics.h>下载之后双击打开会有所有easy-x函数的语法和作用&#xff0c;中…

java基础—方法重载(overload)

一、方法的重载 方法名一样&#xff0c;但参数不一样&#xff0c;这就是重载(overload)。 所谓的参数不一样&#xff0c;主要有两点&#xff1a;第一是参数的个数不一样&#xff0c;第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。 1 packa…

word 编辑域中的汉字_word中插入的cad对象无法双击编辑问题解决记录

昨日&#xff0c;安装了天正插件5.0后&#xff0c;插入word中的cad图无法编辑了&#xff0c;弹出提示的大意是检查是否安装了cad或者是否关闭了CAD中所有的弹窗。在此之前&#xff0c;计算机装了office2010和cad2014及cad2018&#xff0c;office自动关联cad2018&#xff0c;即使…

php实现注册登陆验证

欢迎界面很简单&#xff0c;直接放上代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head&…

iOS touch事件单击双击区分响应

如果您的 iPhone 应用里有个 view&#xff0c;既有单击操作又有双击操作。用户双击 view 时&#xff0c;总是先执行一遍单击的操作再执行双击的操作。所以直接判断时就会发现不能直接进入双击操作。下面是区分 touch 事件是单击还是双击的方法 -(void)singleTap{ NSLog(&quo…

搭建高可用的redis集群,避免standalone模式带给你的苦难

现在项目上用redis的话&#xff0c;很少说不用集群的情况&#xff0c;毕竟如果生产上只有一台redis会有极大的风险&#xff0c;比如机器挂掉&#xff0c;或者内存爆掉&#xff0c;就比如我们生产环境 曾今也遭遇到这种情况&#xff0c;导致redis内存不够挂掉的情况&#xff0c;…

python计算a的平方加b的平方_NumPy计算范数2的平方

老实说&#xff0c;没有比np.inner或np.dot更快的了。如果你觉得中间变量很烦人&#xff0c;你可以创建一个lambda函数&#xff1a;sqeuclidean lambda x: np.inner(x, x)np.inner和np.dot利用BLAS例程&#xff0c;几乎肯定比标准的元素乘法加和快。In [1]: %%timeit -n 1 -r …

php连接MySQL

先说一下我踩了三天的坑 我在这之前用mysql申请了一个数据库&#xff0c;然后用php连接一直连接不上&#xff0c;试了许多办法&#xff0c;都不行 下载MySQL时显示3306端口被占用&#xff0c;所以选了3307 一直报错&#xff0c;三天后&#xff0c;终于知道了&#xff0c;你用的…

SVG动画

动画原理 SVG动画&#xff0c;就是元素的属性值关于时间的变化。 如下图来说&#xff0c;元素的某个属性值的起始值&#xff08;from&#xff09;到结束值&#xff08;to&#xff09;在一个时间段&#xff08;duration&#xff09;根据时间函数&#xff08;timing-function&…

bootstrap弹出的模态框水平垂直居中的实现

学习javascript从入门到放弃&#xff01;&#xff0c;这是第一篇随笔&#xff0c;经验不足&#xff0c;如有不当之处&#xff0c;还望指出。好了废话不多说直接切入正题吧 1.bootstrap默认的model写法&#xff1a; //触发模态框的button <button data-toggle"modal&quo…

python开发实践教程_Python开发实践教程

前言第一章 通过求三角形面积步入Python程序世界 案例1-1 求三角形面积 导读 知识梳理与扩展 小结 练习一第二章 常用运算、使用自定义函数 案例2-1 用函数的方法计算三角形面积 导读 案例2-2 开发一个求三角形面积的工具包 知识梳理与扩展 小结 练习二第三章 分支、循环和列表…