OS: MTK 6.0
1.添加一个控制显示的开关
- 源码路径:/packages/apps/Settings/src/com/mediatek/settings/fuelgauge/PowerUsageExts.java
在setting中电量设置项新增一项
public void initPowerUsageExtItems() {
...
// add for battery percentage
mBatteryPercentPrf = new SwitchPreference(mContext);
mBatteryPercentPrf.setKey(KEY_BATTERY_PERCENTAGE_ENABLE);
mBatteryPercentPrf.setTitle(R.string.battery_percentage_title);
mBatteryPercentPrf.setOrder(PREFERENCE_ORDER_FIRST);
mBatteryPercentPrf.setChecked(true);
mPowerUsageScreen.addPreference(mBatteryPercentPrf);
//add end
}
public boolean onPowerUsageExtItemsClick(PreferenceScreen preferenceScreen
Preference preference) {
// add by wxd for battery percentage
if (KEY_BATTERY_PERCENTAGE_ENABLE.equals(preference.getKey())) {
if (preference instanceof SwitchPreference) {
SwitchPreference pref = (SwitchPreference) preference;
int bgState = pref.isChecked() ? 1 : 0;
Log.d(TAG, "battery percentage enable state: " + bgState);
Settings.System.putInt(mContext.getContentResolver(),
"BATTERY_PERCENTAGE_ENABLE", bgState);
Intent intent = new Intent(ACTION_BATTERY_PERCENTAGE_ENABLE);
mContext.sendBroadcast(intent); // 状态发生变化发送广播,显示或隐藏电量百分比
if (mBatteryPercentPrf != null) {
mBatteryPercentPrf.setChecked(pref.isChecked());
}
}
return true;
}
//add end
2.添加电量显示的textview
- 源码路径:/frameworks/base/packages/SystemUI/res/layout/status_bar.xml
<include layout="@layout/system_icons" />
<TextView android:id="@+id/battery_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingEnd="@dimen/battery_level_padding_end"
android:textColor="#ffffff"
android:visibility="gone"
android:textSize="@dimen/battery_level_text_size"
android:importantForAccessibility="noHideDescendants"/>
3.电量显示
- 源码路径:/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
PhoneStatusBar中有个电量变化的监听回调
protected PhoneStatusBarView makeStatusBarView() {
...
battery_level_tv = (TextView)mStatusBarView.findViewById(R.id.battery_level); // add
...
mBatteryController.addStateChangedCallback(new BatteryStateChangeCallback() {
@Override
public void onPowerSaveChanged() { // 省电模式变化
mHandler.post(mCheckBarModes);
if (mDozeServiceHost != null) {
mDozeServiceHost.firePowerSaveChanged(mBatteryController.isPowerSave());
}
}
@Override
public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) { // 电量变化回调
// add start
percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
isBatteryPercentage = Settings.System.getInt(mContext.getContentResolver(),
"BATTERY_PERCENTAGE_ENABLE", 1) != 0;
refreshBatteryPercentage();
// add end
}
});
...
// add 注册电量显示开关使能广播
IntentFilter batteryPercentfilter = new IntentFilter();
batteryPercentfilter.addAction(ACTION_BATTERY_PERCENTAGE_ENABLE);
context.registerReceiver(mBatteryPercentReceiver, batteryPercentfilter);
//add end
...
}
// add for battery percentage
private void refreshBatteryPercentage(){
if (isBatteryPercentage) {
battery_level_tv.setText(percentage);
battery_level_tv.setVisibility(View.VISIBLE);
} else {
battery_level_tv.setVisibility(View.GONE);
}
}
private TextView battery_level_tv;
private String percentage;
private boolean isBatteryPercentage = false;
private static final String ACTION_BATTERY_PERCENTAGE_ENABLE = "action_battery_percentage_enable";
private BroadcastReceiver mBatteryPercentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_BATTERY_PERCENTAGE_ENABLE.equals(action)) {
if (battery_level_tv == null) {
battery_level_tv = (TextView)mStatusBarView.findViewById(R.id.battery_level);
}
isBatteryPercentage = Settings.System.getInt(mContext.getContentResolver(),
"BATTERY_PERCENTAGE_ENABLE", 1) != 0;
refreshBatteryPercentage();
}
}
};
// add end
其实,上面的mBatteryController是一个广播,监听电量变化的广播Intent.ACTION_BATTERY_CHANGED
- 源码路径:/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController