概述
Doze的退出,说的更严格一点,就是当Doze模式的状态由其他状态变为ACTIVE状态。简而言之,退出Doze模式有三种情况:屏幕亮屏、插入充电器、设备有移动。下面就这三种情况进行下分析。
在前面的分析中我们有见到过becomeActiveLocked()
方法,这个方法当时没有进行分析,这个方法就是用来退出Doze的,严格来说,是将Doze状态置为了ACTIVE状态,从而退出IDLE状态或MAINTENANCE状态。因此,不管是何种方式退出Doze,都会调用这个方法。该方法如下:
void becomeActiveLocked(String activeReason, int activeUid) {
if (mState != STATE_ACTIVE || mLightState != STATE_ACTIVE) {
//设置一个Handler,在Handler中通知PMS、发送idle changed 广播
scheduleReportActiveLocked(activeReason, activeUid);
//将DeepDoze状态值置为STATE_ACTIVE
mState = STATE_ACTIVE;
//将LightDoze状态值置为LIGHT_STATE_ACTIVE
mLightState = LIGHT_STATE_ACTIVE;
//多久后进入INACTIVE状态
mInactiveTimeout = mConstants.INACTIVE_TIMEOUT;
mCurIdleBudget = 0;
mMaintenanceStartTime = 0;
//重置DeepDoze相关属性值、alarm、listener等
resetIdleManagementLocked();
//重置LightDoze相关属性值、alarm、listener等
resetLightIdleManagementLocked();
}
}
1.屏幕亮灭屏
当亮屏或灭屏时,PMS发送亮灭屏广播,DIC中监听了亮灭屏的广播,负责接受该广播并进行屏幕状态改变后的操作:
注册广播:
filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
getContext().