android-5.0关机流程-framework层

本文详细解析了Android 5.0系统中,长按电源键进行关机操作的流程。从PhoneWindowManager.java的interceptKeyBeforeQueueing开始,经由WindowManagerService传递给ShutdownThread来执行实际的关机操作。重启操作则通过lowLevelReboot函数,通过设置sys.powerctl属性来实现,包括进入recovery模式。后续文章将进一步探讨kernel层的关机流程。
摘要由CSDN通过智能技术生成

本文是基于android 5.0的源码来分析的:

当长按power键来进行关机操作时,按键信息会被分发到PhoneWindowManager.java的interceptKeyBeforeQueueing来进行处理:

public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
……
case KeyEvent.KEYCODE_POWER:{
                result &= ~ACTION_PASS_TO_USER;
                if (down) {
                    boolean panic = mImmersiveModeConfirmation.onPowerKeyDown(interactive,
                            event.getDownTime(), isImmersiveMode(mLastSystemUiFlags));
                    if (panic) {
                        mHandler.post(mRequestTransientNav);
                    }
                    if (interactive && !mPowerKeyTriggered
                            && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
                        mPowerKeyTriggered = true;
                        mPowerKeyTime = event.getDownTime();
                        interceptScreenshotChord();//抓屏
                    }

                    TelecomManager telecomManager = getTelecommService();
                    boolean hungUp = false;
                    if (telecomManager != null) {
                        if (telecomManager.isRinging()) {
                            // Pressing Power while there's a ringing incoming
                            // call should silence the ringer.
                            telecomManager.silenceRinger();
                        } else if ((mIncallPowerBehavior
                                & Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP) != 0
                                && telecomManager.isInCall() && interactive) {
                            // Otherwise, if "Power button ends call" is enabled,
                            // the Power button will hang up any current active call.
                            hungUp = telecomManager.endCall();
                        }
                    }
                     mIsScreenOn = isScreenOn();
                    Log.d(TAG,"interceptPowerKeyDown:" + !interactive + ":" + hungUp + ":" +
                            mVolumeDownKeyTriggered + ":" + mVolumeUpKeyTriggered);
                    interceptPowerKeyDown(!interactive || hungUp
                            || mVolumeDownKeyTriggered || mVolumeUpKeyTriggered);
                } else {
                    mPowerKeyTriggered = false;
                    cancelPendingScreenshotChordAction();
                    // added for can't suspend issue
                    Log.d(TAG, "interceptPowerKeyUp:" + canceled + ":" + mPendingPowerKeyUpCanceled);
                    if (interceptPowerKeyUp(canceled || mPendingPowerKeyUpCanceled)) {
                        if (mScreenOnEarly && !mScreenOnFully) {
                            Slog.i(TAG, "Suppressed redundant power key press while "
                                    + "already in the process of turning the screen on.");
                        } else {
                            powerShortPress(event.getEventTime());
                        }
                        isWakeKey = false;
                    }
                    mPendingPowerKeyUpCanceled = false;
                }
                break;
            }
……
}

interceptKeyBeforeQueueing方法主要做一些对特殊按键的处理,上面的代码包行了长按电源键时间的处理,如静默来电铃声,屏幕截图,系统将根据电源键按下的时间长短和相关按键的使用情况来恰当的处理当前的用户操作这里可以看到当电源键按下时做一些处理,当电源键按下且没有截屏操作触发时interceptPowerKeyDown将会被调用,这时其他的按键响应(其他按键响应指interceptKeyBeforeQueueing的cases)将不会被触发。

     private void interceptPowerKeyDown(boolean handled) {
        mPowerKeyHandled = handled;
        if (!handled) {
            mOnlyShowFlashlight = false;
            mHandler.postDelayed(mPowerLongPress, ViewConfiguration.getGlobalActionKeyTimeout());
        } else if (!mIsScreenOn) {
            mPowerKeyHandled = mIsScreenOn;
            mOnlyShowFlashlight = true;
            Log.d("FlashLight",
                    "PhoneWindowManager........interceptePowerKeyDown, we will run mPowerLongPress");
            mHandler.postDelayed(mPowerLongPress, 1500);
        }
    }
interceptPowerKeyDown函数将注册一个回调函数,在500ms超时事件ViewConfiguration.getGlobalActionKeyTimeout()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值