• 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是画上去的。

  • 相关阅读:
    python 列表
    pytho set集合
    python 字典
    并发编程(原理篇 上)
    面向对象分析方法
    python 小记 整数与小数id
    python入门 第二天笔记
    python 元组问题解决
    python入门第一天作业。讲师写的代码。
    python学习笔记enumerate()与range(len)运用及赋值小计
  • 原文地址:https://www.cnblogs.com/muhuacat/p/5613400.html
Copyright © 2020-2023  润新知