Android 按power键唤醒屏幕流程

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方法。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值