前面我们介绍Doze模式的时候介绍过WakeLock白名单,WakeLock进入Doze接口等。这篇博客我们详细分析下,WakeLock在Doze模式下如何生效。
设置白名单
在DeviceIdleController中我们调用PowerManagerService的如下接口,来设置WakeLock的白名单。注意这里设置的appid就是uid。
@Override
public void setDeviceIdleWhitelist(int[] appids) {
setDeviceIdleWhitelistInternal(appids);
}
setDeviceIdleWhitelistInternal接口,就是把白名单放到mDeviceIdleWhitelist中。如果当前在Doze模式下,调用updateWakeLockDisabledStatesLocked函数
void setDeviceIdleWhitelistInternal(int[] appids) {
synchronized (mLock) {
mDeviceIdleWhitelist = appids;
if (mDeviceIdleMode) {//Doze模式下
updateWakeLockDisabledStatesLocked();
}
}
}
updateWakeLockDisabledStatesLocked函数就是遍历所有的WakeLock,然后又持cpu锁的(这才是阻止设备睡眠的根本),调用setWakeLockDisabledStateLocked函数,这个函数就是是否要把这个WakeLock