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

时间: 2024-10-29 03:42:01

Android 5.1 - 状态栏充电标志问题的相关文章

Android 透明的状态栏有渐变的阴影效果

前言 欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 状态栏透明后有渐变的阴影效果,如何去除? 这是google default设计,如果桌面壁纸是白色的时候比较明显,这个渐进的效果是通过背景图来设置的,在frameworks/base/packages/systemui/res/ 里面drawable-hdpi(如果是其

Android 沉浸式状态栏

效果图 android 5.0 以上 android 4.4 API 19 以上都是原生安卓系统的效果,具体到国内的各种各样改过的系统可能会有细微差别,测试过小米和华为的机器效果基本一样. 实现 1.修改主题属性 方法一: 在values-v19文件夹下声明AppTheme为透明状态栏,代码如下 1 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 2 <!-- C

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

以前写过一个沉浸式状态栏 的实现方式 Android 沉浸式状态栏 实现方式一 现在有个更为简单的实现方式 . 相关链接 http://www.apkbus.com/forum.php?mod=viewthread&tid=255929&extra=page%3D3%26filter%3Dsortid%26orderby%3Ddateline%26sortid%3D12 1.效果图 demo 的 github 地址  https://github.com/zyj1609wz/Android

android 实现自定义状态栏通知(Status Notification)

在android项目的开发中,有时为了实现和用户更好的交互,在通知栏这一小小的旮旯里,我们通常需要将内容丰富起来,这个时候我们就需要去实现自定义的通知栏,例如下面360或者网易的样式: 首先我们要了解的是 自定义布局文件支持的控件类型:Notification的自定义布局是RemoteViews,因此,它仅支持FrameLayout.LinearLayout.RelativeLayout三种布局控件,同时支持AnalogClock.Chronometer.Button.ImageButton.I

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

之前的Android沉浸式状态栏实现并没有考虑软键盘的影响,接下来的内容将会针对这个问题给出解决方式,先看一下效果图 这个是一个留言板的效果图: 即弹出软键盘的时候并不会导致整个布局上移. 详细怎样实现?依照下面步骤进行设置: 1.布局文件里声明例如以下 <activity android:name="com.storm.durian.activity.LeaveMessageDetailsActivity" android:screenOrientation="por

Android沉浸式状态栏 + scrollView顶部伸缩 + actionBar渐变

最近需求要做一个拉缩渐变的状态栏,往上拉的时候,需要显示actionBar,这个过程是渐变的,顶部的图片背景能实现拉缩,并且还要实现状态栏沉浸式 效果如如下: 实现状态栏的透明化 实现ScrollView的拉缩 实现ActionBar的渐变 实现 1.至于试下实现ScrollView的拉缩这个效果很简单重写onTouchEvent方法,利用滑动的垂直方向的距离,然后在设置图片的大小 这里要注意的是:在手指释放的时候需要进行恢复图片的高度如果有兴趣的话可以加入Android工程师交流Q群:7520

Android沉浸式状态栏攻略

前言 这里不讨论[沉浸式]这个词用得好不好, 大家听得懂就行. 这篇文章主要是我在实际项目中的一些经验, 整理出来和大家分享, 欢迎探讨. 由于实习一直是996, 没时间做总结, 今天突然觉得这样的工作让我都忘了生活了, 是时候做个了断了. 写这篇文章的时候已经是23:44, 来不及贴一些demo, 但是这里的代码都是曾经的项目中摘出来的, 是可以运行的, 但我现在没有真的执行一遍. 注意所有的代码都只在android 4.4及以上有效. 考虑 根据实际项目的不同, 可能选择的沉浸式实现策略也会

android沉浸式状态栏实现

传统的手机状态栏是呈现出黑色条状的,有的和手机主界面有很明显的区别.这样就在一定程度上牺牲了视觉宽度,界面面积变小. 沉浸模式的状态栏和主界面完全融为了一体,在设计上有不同的视觉感受. 我们先上两张图,很容易看出区别:        Android在4.4的时候增加了透明状态栏与导航栏的功能,依托于这个新特性,我们可以开始跟随潮流,实现Android的沉浸式状态栏 其实上图展示的这个关于界面的代码非常简单 /** * 关于界面 * * @author SuS * @time 2015.07.29

【Android】透明状态栏在App中的实现与接口设计

By Sodino 文章目录 1. 认识透明状态栏 2. 透明状态栏Api及特性 3. 设置透明状态栏 4. 处理消失的系统状态栏区域 5. fitsSystemWindows 6. Activity中的接口设计 7. Fragment中的接口设计 8. 白色Titlebar的处理 9. 小米 与 魅族 与 (莫名其妙的)华为 10. 腾讯优测UTest GitHub源码:TransparentStatusbar源码中分两个app TestBasic: 透明状态栏实现的示例,方便debug 白色