亮屏有很多种方式,如Power键亮屏、插拔USB亮屏、来电亮屏......,虽然方式不同,但只要发起亮屏,其流程都是一样的。PowerManager中提供了wakeUp()方法给其他组件或应用来点亮屏幕,下面就从这个方法开始分析亮屏流程。/**
* @param time 亮屏时间
* @param reason 亮屏原因
* @param details 细节描述
*/
public void wakeUp(long time, @WakeReason int reason, String details) {
try {
mService.wakeUp(time, reason, details, mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
调用PowerManager的wakeUp()后,将直接调用PMS#wakeUp()方法,在进行权限检查后,调用wakeUpInternal()进入到PMS内部流程:
// frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
private void wakeUpInternal(long eventTime, @WakeReason int reason, String details, int uid,
String opPackageName, int opUid) {
synchronized (mLock) {
// 进行亮屏流程
if (wakeUpNoUpdateLocked(eventTime, reason, details, uid, opPackageName, opUid)) {
// 更新全部状态
updatePowerStateLocked();
}
}
}
这个方法中:
首先,调用wakeUpNoUpdateLocked()方法;
然后,根据调用返回值确定是否更新全局状态;
1.wakeUpNoUpdateLocked()验证和亮屏状态更新
此方法是进行亮屏的主要方法,如果亮屏成功,该方法返回true,并更新全局状态,如果因不满足亮屏条件,则返回false,说明亮屏失败:
// frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
private boolean wakeUpNoUpdateLocked(long eventTime, @WakeReason int reason, String details,
int reasonUid, String opPackageName, int opUid) {
// 此次亮屏时间小于最近一次灭屏时间、已经处于亮屏、系统未启动完成或强制suspend,不会进行亮屏
if (eventTime < mLastSleepTime || mWakefulness == WAKEFULNESS_AWAKE
|| !mBootCompleted || !mSystemReady || mForceSuspendActive) {
return false;
}
try {
mLastWakeTime = eventTime; // 更新最后一次亮屏时间
mLastWakeReason = reason; // 更新亮屏原因
// 更新mWakefulness值
setWakefulnessLocked(WAKEFULNESS_AWAKE, reason, eventTime);
// 通知其他组件亮屏动作
mNotifier.onWakeUp(reason, details, reasonUid, opPackageName, opUid);
// 更新用户活动时间
userActivityNoUpdateLocked(
eventTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, reasonUid);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}
return true;
}
首先,进行亮屏时间和状态的验证,如果满足以下三个条件之一,则亮屏不会成功,返回false,验证完成后,开始执行亮屏流程:
此次亮屏时间小于最近一次灭屏时间;
唤醒状态已经处于亮屏;
系统未启动完成或强制suspend。
接下来,会更新mLastWakeTime和mLastWakeReason,表示最后一次亮屏时间和原因。
然后,调用setWakefuln