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 - 状态栏充电标志问题的更多相关文章

  1. Android 沉浸式状态栏 实现方式二 ( 更简单 )

    以前写过一个沉浸式状态栏 的实现方式 Android 沉浸式状态栏 实现方式一 现在有个更为简单的实现方式 . 相关链接 http://www.apkbus.com/forum.php?mod=vie ...

  2. 68.Android之透明状态栏

    转载:http://www.jianshu.com/p/2f17d0e7f6b0 Android开发中需要透明状态栏,注意:本文只适配Android4.4以上及5.0以上设备 概述 有时候我们想在 a ...

  3. android 沉浸式状态栏的实现

    本文介绍一种简单的实现沉浸式状态栏的方法,要高于或等于api19才可以. 实现android沉浸式状态栏很简单,添加代码两步就可以搞定. 一.在activity中添加 getWindow().addF ...

  4. [置顶] Xamarin android沉浸式状态栏

    虽然关于android "沉浸式"状态栏有很多博客介绍过,从小菜到大神无一例外.我第一次看到这种"沉浸"式的效果我也以为真的是这么叫,然而根本不是这么回事,完全 ...

  5. Android 沉浸式状态栏完美解决方案

    现在搜索Android 沉浸式状态栏,真的是一堆一堆,写的特别多,但是真正用的舒服的真没有,在这里自己整理一下开发记录 注意,在使用这个步骤过程之前,请把之前设置的代码注释一下 把布局带有androi ...

  6. Android沉浸式状态栏(透明状态栏)最佳实现

    Android沉浸式状态栏(透明状态栏)最佳实现 在Android4.4之前,我们的应用没法改变手机的状态栏颜色,当我们打开应用时,会出现上图中左侧的画面,在屏幕的顶部有一条黑色的状态栏,和应用的风格 ...

  7. 【Android实战】Android沉浸式状态栏实现(下)

    之前的Android沉浸式状态栏实现并没有考虑软键盘的影响,接下来的内容将会针对这个问题给出解决方式,先看一下效果图 这个是一个留言板的效果图: 即弹出软键盘的时候并不会导致整个布局上移. 详细怎样实 ...

  8. Android 8.1 关机充电动画(三)Android模式

    system:Android 8.1 platform:RK3326/PX30 uboot kernel system/core/healthd Android 8.1 关机充电动画(一)模式选择 A ...

  9. Android 8.1 关机充电动画(二)Uboot模式

    system:Android 8.1 platform:RK3326/PX30 uboot kernel Android 8.1 关机充电动画(一)模式选择 Android 8.1 关机充电动画(二) ...

随机推荐

  1. C# 匿名方法

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  2. Http错误 404.3-Not Found....或者500.19 Internal Server Error

    解决方法:以管理员身份打开VS2010x64位兼容命令提示:aspnet_regiis -i

  3. Oracle 10046跟踪事件使用方法

    1.开启10046跟踪事件 alter session set events '10046 trace name context forever, level 12'; 如果想更容易标识trace文件 ...

  4. 向数据库中导入AWR数据

    使用$ORACLE_HOME/rdbms/admin/awrload.sql $ sqlplus '/as sysdba' SQL*Plus: Release Production on Fri No ...

  5. c# 多线程与异步调用

    异步操作的本质 在方法调用前为异步方法指定一个回调函数,方法调用后被线程池中的一个线程接管,执行该方法.主线程立即返回,继续执行其他工作或响应用户请求.如果异步方法执行完 毕,回调函数被自动执行,以处 ...

  6. HTML语言的一些元素(四)

    以下资料整理自网路 1.锚点是网页制作中超级链接的一种,又叫命名锚记.命名锚记像一个迅速定位器一样是一种页面内的超级链接,运用相当普遍. 英文名:anchor 使用命名锚记可以在文档中设置标记,这些标 ...

  7. 文字排版一律用plist

    NSMutableArray *newhealthArr = [NSMutableArray new]; NSArray *healthTitleArr = [NSArray arrayWithCon ...

  8. 我写了本破书-swift语言实战晋级

    本书是一本介绍Swift实战的实用图书,旨在帮有一定编程基础的童鞋能够快速上手Swift. 本书的结构是先讲解了Swift语言的精要,没有基础的童鞋可以学习,有基础的童鞋可以当做复习. 接着讲解如何用 ...

  9. Lintcode: Binary Tree Serialization (Serialization and Deserialization Of Binary Tree)

    Design an algorithm and write code to serialize and deserialize a binary tree. Writing the tree to a ...

  10. JAVA-语法-运算符

    1.赋值运算符  =  (优先级较低) 2.算数运算符  +  —  *  /  % 3.字符串连接运算   +  (把其他类型转成字符串并和字符串类型进行连接) 4.扩展赋值运算符   +=   — ...