Android 充电的方式有三种:电源充电,USB充电,无线充电,其中原生实现了无线充电的动画,以及相关提示音,无线充电动画的起始位置则是从PowerManagerService开始
流程分析
1. PowerManagerService
在PowerManagerService中有这样一个方法updateIsPoweredLocked,在充电状态发生改变时都会进入到该方法,而无线充电的处理逻辑也在此方法中
private void updateIsPoweredLocked(int dirty) {
if ((dirty & DIRTY_BATTERY_STATE) != 0) {
final boolean wasPowered = mIsPowered;
final int oldPlugType = mPlugType;
final boolean oldLevelLow = mBatteryLevelLow;
//BatteryManagerInternal的实现类再BatteryService中,isPowered中查看当前state是否
//为AC,USB,Wireless,如果是则返回true
mIsPowered = mBatteryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY);
//当前插入的类型 AC,USB,Wireless
mPlugType = mBatteryManagerInternal.getPlugType();
//电池电量
mBatteryLevel = mBatteryManagerInternal.getBatteryLevel();
//电量小于等于15则为低电状态
mBatteryLevelLow = mBatteryManagerInternal.getBatteryLevelLow();
if (wasPowered != mIsPowered || oldPlugType != mPlugType) {
mDirty |= DIRTY_IS_POWERED;
//更新无线充电的状态,此值决定当前是否为无线充电
final boolean dockedOnWirelessCharger = mWirelessChargerDetector.update(
mIsPowered, mPlugType);
// 将插拔设备视为用户行为。当用户插上或拔出设备时,它会立即关闭,
// 这让用户感到不安。有些设备在插入或拔出时也会唤醒设备,因为它们
// 没有充电指示灯。
final long now = mClock.uptimeMillis();
//判断当前状态是否应该亮屏,插入USB充电或无线充电时会亮屏
//google 在此方法中做了一些错误状态规避
if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType,
dockedOnWirelessCharger)) {
//去点亮屏幕
wakeUpNoUpdateLocked(now, PowerManager.WAKE_REASON_PLUGGED_IN,
"android.server.power:PLUGGED:" + mIsPowered, Process.SYSTEM_UID,
mContext.getOpPackageName(), Process.SYSTEM_UID);
}
userActivityNoUpdateLocked(
now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
// 仅在启动完成后播放充电声音,因此充电声音不会与潜在的通知声音一起播放
// mBootCompleted此值在启动完成后会置为true
if (mBootCompleted) {
if (mIsPowered && !BatteryManager.isPlugWired(oldPlugType)
&& BatteryManager.isPlugWired(mPlugType)) {
mNotifier.onWiredChargingStarted(mUserId);
} else if (dockedOnWirelessCharger) {
//通知无线充电状态
mNotifier.onWirelessChargingStarted(mBatteryLevel, mUserId);
}
}
}
mBatterySaverStateMachine.setBatteryStatus(mIsPowered, mBatteryLevel, mBatteryLevelLow);
}
}
此方法会在多种情况下调用,接收电池改变广播,以及其他一些情况
最终如果dockedOnWirelessCharger值为true的话,会向下通知无线