statusbar
電池狀態(tài)是在statusbar顯示的,statusbar 的代碼在 frameworks/base/packages/SystemUI
中實現(xiàn)躯嫉,而且是通過MVC的架構來管理的牵囤。
Model
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
QuickSettingsModel 實現(xiàn)了狀態(tài)的callback季春,并且持有View的實例,代碼如下:
class QuickSettingsModel implements
BatteryStateChangeCallback {
···
static class BatteryState extends State {
int batteryLevel;
boolean pluggedIn;
}
private QuickSettingsTileView mBatteryTile;
private RefreshCallback mBatteryCallback;
private BatteryState mBatteryState = new BatteryState();
···
// Battery
void addBatteryTile(QuickSettingsTileView view, RefreshCallback cb) {
mBatteryTile = view;
mBatteryCallback = cb;
mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
}
// BatteryController callback
@Override
public void onBatteryLevelChanged(int level, boolean pluggedIn) {
mBatteryState.batteryLevel = level;
mBatteryState.pluggedIn = pluggedIn;
mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
}
void refreshBatteryTile() {
mBatteryCallback.refreshView(mBatteryTile, mBatteryState);
}
View
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsTileView.java
class QuickSettingsTileView extends FrameLayout {
}
Controller
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
BatteryController 通過廣播接收器烤咧,獲取到電池現(xiàn)在的狀態(tài)后亚茬,回調(diào)所有在這里注冊了的callback
public class BatteryController extends BroadcastReceiver {
public void addStateChangedCallback(BatteryStateChangeCallback cb) {
mChangeCallbacks.add(cb);
}
public void onReceive(Context context, Intent intent) {
...
for (BatteryStateChangeCallback cb : mChangeCallbacks) {
cb.onBatteryLevelChanged(level, plugged);
}
...
}
}
}
MVC
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
QuickSettings 持有一個model和batteryController酪耳,
class QuickSettings {
private QuickSettingsModel mModel;
...
void setup(NetworkController networkController, BluetoothController bluetoothController,
BatteryController batteryController, LocationController locationController,
RotationLockController rotationLockController) {
...
//batteryController會回調(diào)model的Callback,也就是說C會控制M
batteryController.addStateChangedCallback(mModel);
...
}
private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) {
// Battery
final QuickSettingsTileView batteryTile = (QuickSettingsTileView)
inflater.inflate(R.layout.quick_settings_tile, parent, false);
batteryTile.setContent(R.layout.quick_settings_tile_battery, inflater);
batteryTile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startSettingsActivity(Intent.ACTION_POWER_USAGE_SUMMARY);
}
});
//Model控制View的刷新
mModel.addBatteryTile(batteryTile, new QuickSettingsModel.RefreshCallback() {
@Override
public void refreshView(QuickSettingsTileView unused, State state) {
QuickSettingsModel.BatteryState batteryState =
(QuickSettingsModel.BatteryState) state;
String t;
if (batteryState.batteryLevel == 100) {
t = mContext.getString(R.string.quick_settings_battery_charged_label);
} else {
t = batteryState.pluggedIn
? mContext.getString(R.string.quick_settings_battery_charging_label,
batteryState.batteryLevel)
: mContext.getString(R.string.status_bar_settings_battery_meter_format,
batteryState.batteryLevel);
}
((TextView)batteryTile.findViewById(R.id.text)).setText(t);
batteryTile.setContentDescription(
mContext.getString(R.string.accessibility_quick_settings_battery, t));
}
});
parent.addView(batteryTile);
}
}