android 5.1 非STR待机流程

本文详细分析了Android 5.1系统中非STR(Speedy Boot Technology Reboot)待机的过程,从PhoneWindowManager、WindowManagerService、ShutdownThread、PowerManagerService、PowerManagerService JNI层到Power HAL层的逐步操作,揭示了设备在非STR待机状态下如何进入彻底断电的状态,以及如何确保正常待机流程的执行。
摘要由CSDN通过智能技术生成

android在长按Power键(手机或pad)或按下电源键(电视)会进入待机状态,下面分析一下非STR待机流程。

待机分STR和非STR待机。

STR待机是为了实现快速开关机,提高开机速度。android自身支持STR,OEM可以根据自身需要进行深度定制。STR待机时,PM芯片仍然供电,其他断电,当STR开机时,从PM芯片唤醒,回复到STR待机前状态,从而提高开机速度。

非STR待机即正常待机,待机后会彻底断电,这里只分析android层的行为。

1 PhoneWindowManager处理逻辑

按键在给到WindowManagerService之前,会先给到PhoneWindowManager进行处理。
 /** {@inheritDoc} */
    @Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
    //KeyEvent入队
    ...
     case KeyEvent.KEYCODE_POWER: {
	Log.d(TAG,"KEYCODE_POWER.....");
         result &= ~ACTION_PASS_TO_USER;
         isWakeKey = false; // wake-up will be handled separately
          if (down) {
               interceptPowerKeyDown(event, interactive);
           } else {
               interceptPowerKeyUp(event, interactive, canceled);
            }
           break;
在key Down时,执行interceptPowerKeyDown逻辑,这段逻辑会处理正常待机流程。
在key Up时,执行interceptPowerKeyUp逻辑,这段逻辑出来STR待机流程。
  private void interceptPowerKeyDown(KeyEvent event, boolean interactive) {
        // Hold a wake lock until the power key is released.
        if (!mPowerKeyWakeLock.isHeld()) {
            //获取wakeLock
            mPowerKeyWakeLock.acquire();
        }
     ...
     // Latch power key state to detect screenshot chord.
        if (interactive && !mScreenshotChordPowerKeyTriggered
                && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
            mScreenshotChordPowerKeyTriggered = true;
            mScreenshotChordPowerKeyTime = event.getDownTime();
            //截图,STR和非STR待机都会执行截图,截图为了在待机时画面看起来很和谐
            interceptScreenshotChord();
        }
     ...
      // When interactive, we're already awake.
                // Wait for a long press or for the button to be released to decide what to do.
                if (hasLongPressOnPowerBehavior()) {  //如果不是LONG_PRESS_POWER_NOTHING
                    if (enable_str == false) {  //非STR
                        if (mShortPressOnPowerBehavior < 0) {  //如果等于0,重新赋值
                            mShortPressOnPowerBehavior = mContext.getResources().getInteger(
                                    com.android.internal.R.integer.config_shortPressOnPowerBehavior);
                        }
                       //发送MSG_POWER_LONG_PRESS,处理待机事件
                        Message msg = mHandler.obtainMessage(MSG_POWER_LONG_PRESS);
                        msg.setAsynchronous(true);
                        //是否延迟待机
                        mHandler.sendMessageDelayed(msg,
                                (mShortPressOnPowerBehavior == SHORT_PRESS_POWER_SHUT_DOWN) ?
                                0 : ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());
                    }
config_shortPressOnPowerBehavior默认值是1,在frameworks\base\core\res\res\values\config.xml中有定义:
    <!-- Control the behavior when the user short presses the power button.
            0 - Nothing
            1 - Go to sleep (doze)
            2 - Really go to sleep (don't doze)
            3 - Really go to sl
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值