http://blog.csdn.net/shadow_dance/article/details/8070252
屏幕唤醒流程:
/framework/base/policy下面KeyguardViewMediator.java里面 public void pokeWakelock(int holdMs) { synchronized (this) { if (DBG_WAKE) Log.d(TAG, "pokeWakelock(" + holdMs + ")"); mWakeLock.acquire(); mHandler.removeMessages(TIMEOUT); mWakelockSequence++; Message msg = mHandler.obtainMessage(TIMEOUT, mWakelockSequence, 0); mHandler.sendMessageDelayed(msg, holdMs); } } 这个方法就是用mHandler去执行TIMEOUT事件。 可以看得出来,每次调用的时候,先remove上一个TIMEOUT msg,然后mHandler.sendMessageDelayed(msg, holdMs); 在holdMs时间内(如果有用户事件响应),会重新调用这个方法,重新remove这个msg,重新mHandler.sendMessageDelayed(msg, holdMs);也就是时间重置了,如果接下来的holdMs时间没有用户相应,mHandler就会执行对应的休眠事件(本质就是释放wakelock,pm发现没有wakelock就自动进入sleep状态)。 你到framework/base/policy下面搜索会发现蛮多地方调用这个方法,对应很多不同的情况。 拿大家最熟悉的Settings中设置的锁屏时间来说吧: 在PhoneWindowManager.java中 /** {@inheritDoc} */ public void screenTurnedOn() { EventLog.writeEvent(70000, 1); mKeyguardMediator.onScreenTurnedOn(); synchronized (mLock) { mScreenOn = true; updateOrientationListenerLp(); updateLockScreenTimeout(); } } 屏幕一变亮,就 updateLockScreenTimeout();更新这个定时锁屏的时间 private void updateLockScreenTimeout() { synchronized (mScreenLockTimeout) { boolean enable = (mAllowLockscreenWhenOn && mScreenOn && mKeyguardMediator.isSecure()); if (mLockScreenTimerActive != enable) { if (enable) { if (localLOGV) Log.v(TAG, "setting lockscreen timer"); mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout); } else { if (localLOGV) Log.v(TAG, "clearing lockscreen timer"); mHandler.removeCallbacks(mScreenLockTimeout); } mLockScreenTimerActive = enable; } } } 看得出来,也是先remove再post msg的方法,更新时间(指的是从现在起剩下多少时间来关屏)。 这里的 mLockScreenTimeout = Settings.System.getInt(resolver, Settings.System.SCREEN_OFF_TIMEOUT, 0);也就是Settings中设置的时间啦。 mScreenLockTimeout是个Runnable对象: Runnable mScreenLockTimeout = new Runnable() { public void run() { synchronized (this) { if (localLOGV) Log.v(TAG, "mScreenLockTimeout activating keyguard"); mKeyguardMediator.doKeyguardTimeout(); mLockScreenTimerActive = false; } } }; 这里就回到KeyguardMediator那里了,doKeyguardTimeout()方法最终会调用到前面说的pokeWakelock方法。 |