我的android版本是5.1。
我是这样去实现的:
首先-----》我在priv-app/Settings里面的battery里面加一条SwitchPreference,这个是是否显示的开关。
通过这个开关将值写入数据库中。然后SystemUI就可以取到这个值控制是否显示
这个battery控制界面是PowerUsageSummary,它是一个PreferenceFragment。
它的界面的绘制是通过好几种途径,最后都通过addPreference加到一个PreferenceGroup里面了。
然后-----》我需要改frameworks层的东西,
1>在android.provider.Settings类的System下面加一个String类型的名字,
System对应的是数据库的名字
例如BATTERY_POWER_PERCENTAGE
2>要修改SettingsProvider这个应用,它是Settings的数据库管理应用,
主要提供了一系列操作数据库的方法,先在defaults.xml里面添加一个integer变量,
给他一个初始值0,0对应不显示,1对应显示。然后找打DatabaseHelper这个类,
它是一个SQLiteOpenHelper,它封装了一系列操作sqlite数据库的方法,
我们在loadSystemSettings方法里面可以将直接在defaults.xml定义的值写入数据库。
3>我们要修改SystemUI这个应用,看过源码才知道,其实状态栏是分3个显示的,
锁屏的时候是一个,对应的类是KeyguardStatusBarView,它是一个RelativeLayout,
对应的布局是Keyguard_status_bar.xml
进入后是一个,对应的类是PhoneStatusBar,它是BaseStatusBar的子类
对应的布局是status_bar.xml.xml
下拉通知菜单的时候又是一个,对应的类是StatusBarHeaderView,它是一个RelativeLayout
它对应的布局是Status_bar_expanded_header.xml
要想监听到电量的变化,必须实现BatteryController.BatteryStateChangeCallback这个接口,
它有两个方法,其中onBatteryLevelChanged方法就是监听电量变化的
BatteryController是一个BroadcastReceiver,当电量变化时可以收到
PowerManager.ACTION_POWER_SAVE_MODE_CHANGED这个action,
这时就会走onBatteryLevelChanged方法,所有我们只要实现这个接口就可以监听到。
KeyguardStatusBarView和StatusBarHeaderView是有实现的,所以在这里我将
PhoneStatusBar也实现了这个接口。当然这不是控制电量百分比是否显示,
在设置里面我们已经加了一个控制开关,它会将值写入数据库,我们在PhoneStatusBar
类中只需要写一个ContentObserver来监听改变来控制,其实这个百分比是一个textview,
PhoneStatusBar对应的布局是status_bar.xml,在里面加一个textview在自定义电池图标的下面,
在代码中只需要用setVisibility方法就可以控制。
KeyguardStatusBarView也是一样这样实现。
好了说了这么多,其实要编译和push的有4个东西,frameworks.jar Setting.apk
SettingsProvider.apk SystemUI.apk