天天看點

SystemUI PoweUI筆記

 private final Receiver mReceiver = new Receiver();

//PowerUI:電源管理,繼承SystemUI,調用start方法啟動

public void start() {

//擷取PowerManager對象,該類主要用于控制電源狀态,處理和power相關的業務

mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);‘

//初始化關屏時間,關屏時間會持續重新整理

mScreenOffTime = mPowerManager.isScreenOn() ? -1 : SystemClock.elapsedRealtime();

//執行個體化PowerNotificationWarnings,Power相關的事件會通過Notification方式進行處理

mWarnings = new PowerNotificationWarnings(mContext, getComponent(PhoneStatusBar.class));

//監控電池電量,電量不足時會發出警告

ContentObserver obs = new ContentObserver(mHandler) {

@Override

public void onChange(boolean selfChange) {

updateBatteryWarningLevels();

}

};

final ContentResolver resolver = mContext.getContentResolver();

//監聽LOW_POWER_MODE_TRIGGER_LEVEL的變化

resolver.registerContentObserver(Settings.Global.getUriFor(

Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),

false, obs, UserHandle.USER_ALL);

//更新電池電量等級

updateBatteryWarningLevels();

//對Receiver進行初始化

mReceiver.init();

}

//更新電池電量等級

void updateBatteryWarningLevels() {

//電池電量有三個關鍵詞:config_criticalBatteryWarningLevel=5,

//config_lowBatteryWarningLevel=15

//config_lowBatteryCloseWarningBump=5

//擷取三個電量等級

int critLevel = mContext.getResources().getInteger(

com.android.internal.R.integer.config_criticalBatteryWarningLevel);

final ContentResolver resolver = mContext.getContentResolver();

int defWarnLevel = mContext.getResources().getInteger(

com.android.internal.R.integer.config_lowBatteryWarningLevel);

int warnLevel = Settings.Global.getInt(resolver,

Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, defWarnLevel);

if (warnLevel == 0) {

warnLevel = defWarnLevel;

}

if (warnLevel < critLevel) {

warnLevel = critLevel;

}

mLowBatteryReminderLevels[0] = warnLevel;

mLowBatteryReminderLevels[1] = critLevel;

mLowBatteryAlertCloseLevel = mLowBatteryReminderLevels[0]

+ mContext.getResources().getInteger(

com.android.internal.R.integer.config_lowBatteryCloseWarningBump);

}

//對receiver進行初始化

public void init() {

IntentFilter filter = new IntentFilter();

//監聽電量的變化

filter.addAction(Intent.ACTION_BATTERY_CHANGED);

filter.addAction(Intent.ACTION_SCREEN_OFF);

filter.addAction(Intent.ACTION_SCREEN_ON);

filter.addAction(Intent.ACTION_USER_SWITCHED);

filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);

filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);

mContext.registerReceiver(this, filter, null, mHandler);

//查詢當時是否是省電模式,并給出Notification通知

updateSaverMode();

}

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

//更新mBatteryLevel,mBatteryStatus,mPlugType,mInvalidCharger

if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {

final int oldBatteryLevel = mBatteryLevel;

mBatteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 100);

final int oldBatteryStatus = mBatteryStatus;

mBatteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS,

BatteryManager.BATTERY_STATUS_UNKNOWN);

final int oldPlugType = mPlugType;

mPlugType = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 1);

final int oldInvalidCharger = mInvalidCharger;

mInvalidCharger = intent.getIntExtra(BatteryManager.EXTRA_INVALID_CHARGER, 0);

final boolean plugged = mPlugType != 0;

final boolean oldPlugged = oldPlugType != 0;

int oldBucket = findBatteryLevelBucket(oldBatteryLevel);

int bucket = findBatteryLevelBucket(mBatteryLevel);

...

mWarnings.update(mBatteryLevel, bucket, mScreenOffTime);

if (oldInvalidCharger == 0 && mInvalidCharger != 0) {

Slog.d(TAG, "showing invalid charger warning");

mWarnings.showInvalidChargerWarning();

return;

} else if (oldInvalidCharger != 0 && mInvalidCharger == 0) {

mWarnings.dismissInvalidChargerWarning();

} else if (mWarnings.isInvalidChargerWarningShowing()) {

// if invalid charger is showing, don't show low battery

return;

}

if (!plugged

&& (bucket < oldBucket || oldPlugged)

&& mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN

&& bucket < 0) {

// only play SFX when the dialog comes up or the bucket changes

final boolean playSound = bucket != oldBucket || oldPlugged;

mWarnings.showLowBatteryWarning(playSound);

} else if (plugged || (bucket > oldBucket && bucket > 0)) {

mWarnings.dismissLowBatteryWarning();

} else {

mWarnings.updateLowBatteryWarning();

}

} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {

mScreenOffTime = SystemClock.elapsedRealtime();

} else if (Intent.ACTION_SCREEN_ON.equals(action)) {

mScreenOffTime = -1;

} else if (Intent.ACTION_USER_SWITCHED.equals(action)) {

mWarnings.userSwitched();

} else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {

updateSaverMode();

} else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {

setSaverMode(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));

} else {

Slog.w(TAG, "unknown intent: " + intent);

}

}

PowerNotificationWarnings.java(通過Notification處理power相關的函數)

 private void updateNotification() {

...

if (mInvalidCharger) {

showInvalidChargerNotification();

mShowing = SHOWING_INVALID_CHARGER;

} else if (mWarning) {

showWarningNotification();

mShowing = SHOWING_WARNING;

} else if (mSaver) {

showSaverNotification();

mShowing = SHOWING_SAVER;

} else {

mNoMan.cancelAsUser(TAG_NOTIFICATION, R.id.notification_power, UserHandle.ALL);

mShowing = SHOWING_NOTHING;

}

}