您的位置:首页 > 移动开发 > Android开发

Android 按power键唤醒屏幕流程

2013-01-12 21:20 363 查看
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方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: