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是画上去的。
Android 5.1 - 状态栏充电标志问题的更多相关文章
- Android 沉浸式状态栏 实现方式二 ( 更简单 )
以前写过一个沉浸式状态栏 的实现方式 Android 沉浸式状态栏 实现方式一 现在有个更为简单的实现方式 . 相关链接 http://www.apkbus.com/forum.php?mod=vie ...
- 68.Android之透明状态栏
转载:http://www.jianshu.com/p/2f17d0e7f6b0 Android开发中需要透明状态栏,注意:本文只适配Android4.4以上及5.0以上设备 概述 有时候我们想在 a ...
- android 沉浸式状态栏的实现
本文介绍一种简单的实现沉浸式状态栏的方法,要高于或等于api19才可以. 实现android沉浸式状态栏很简单,添加代码两步就可以搞定. 一.在activity中添加 getWindow().addF ...
- [置顶]
Xamarin android沉浸式状态栏
虽然关于android "沉浸式"状态栏有很多博客介绍过,从小菜到大神无一例外.我第一次看到这种"沉浸"式的效果我也以为真的是这么叫,然而根本不是这么回事,完全 ...
- Android 沉浸式状态栏完美解决方案
现在搜索Android 沉浸式状态栏,真的是一堆一堆,写的特别多,但是真正用的舒服的真没有,在这里自己整理一下开发记录 注意,在使用这个步骤过程之前,请把之前设置的代码注释一下 把布局带有androi ...
- Android沉浸式状态栏(透明状态栏)最佳实现
Android沉浸式状态栏(透明状态栏)最佳实现 在Android4.4之前,我们的应用没法改变手机的状态栏颜色,当我们打开应用时,会出现上图中左侧的画面,在屏幕的顶部有一条黑色的状态栏,和应用的风格 ...
- 【Android实战】Android沉浸式状态栏实现(下)
之前的Android沉浸式状态栏实现并没有考虑软键盘的影响,接下来的内容将会针对这个问题给出解决方式,先看一下效果图 这个是一个留言板的效果图: 即弹出软键盘的时候并不会导致整个布局上移. 详细怎样实 ...
- Android 8.1 关机充电动画(三)Android模式
system:Android 8.1 platform:RK3326/PX30 uboot kernel system/core/healthd Android 8.1 关机充电动画(一)模式选择 A ...
- Android 8.1 关机充电动画(二)Uboot模式
system:Android 8.1 platform:RK3326/PX30 uboot kernel Android 8.1 关机充电动画(一)模式选择 Android 8.1 关机充电动画(二) ...
随机推荐
- LuaExpat笔记
xml xml是一种格式化数据交换语言, 适用于在网络上不同应用会话. http://www.xml.com/pub/a/98/10/guide0.html exPat 一种C语言实现的 xml 文档 ...
- 记32位程序(使用3gb用户虚拟内存)使用D3DX9导致的一个崩溃的问题
为了增加32位程序的用户虚拟内存的使用量,我们使用了/LARGEADDRESSAWARE编译选项来使32位程序可能使用到3gb的内存,能否使用到3gb内存也跟平台.系统和设置有关系,现摘抄部分作为参考 ...
- MySQL的半同步复制监控
(1)master端 >show variables like 'rpl_semi_sync%'; +------------------------------------+-------+ ...
- Java基础之泛型——使用泛型链表类型(TryGenericLinkedList)
控制台程序 定义Point类: public class Point { // Create a point from its coordinates public Point(double xVal ...
- php获取文件后缀名格式
function get_extension($file) { substr(strrchr($file, '.'), 1); } 第2种方法: function get_extension($fil ...
- 经过本人 6 年.net 工作经验证明 .net 工资确实比 Java 低
很久没有逛博客园了,很久没有出来吐槽了.怎么呢?生活压力大,就需要找地方吐槽. 排版不怎么好,文笔不怎么好,可以看出我不是雇佣的写手. 工作到今夏,已经有6个年头了,一直使用着.net技术,但是最近工 ...
- linux时间的查看与修改
1.查看时间和日期 date 2.设置时间和日期 将系统日期设定成1996年6月10日的命令 date -s 06/22/96 将系统时间设定成下午1点52分0秒的命令 date -s 13:52:0 ...
- Oracle存储过程总结
1.存储过程结构 1.1 第一个存储过程 create or replace procedure proc1( para1 varchar2, para2 out varchar2, para3 in ...
- 夺命雷公狗---DEDECMS----13dedecms首页的完成
我们的dedecms搭建起来后直接复制templets的目录复制一份,如下所示: 然后进入templets目录里面,然后再将default里面的东西都给干掉,然后将我们预先准备好的首页放进来,代码如下 ...
- 为archlinux配置cron
cron的作用:cron可以用来周期性地自动执行一些命令. cron的实现:cron有很多实现版本,例如:cronie, dcron, fcron, bcron, vixie-cron,我安装的是 c ...