jQuery鼠标指针特效

framework中按压power键屏幕熄灭及亮起时流程

启动优化中的一些黑科技,了解一下~启动速度优化是 android 开发中的常见需求,除了一些常规的手段之外,也有一些黑科 - 掘金

安卓锁屏灭屏流程解析-CSDN博客

安卓锁屏亮屏流程解析-CSDN博客

相关的类

PhoneWindowManager类实现接口WindowManagerPolicy,接口中提供相关函数如下:
startedGoingToSleep :开始睡眠操作
finishedGoingToSleep:完成睡眠操作
startedWakingUp:开始唤醒操作
finishedWakingUp:完成唤醒操作(此时屏幕已经亮起)
Android framework中屏幕熄灭及亮起时添加操作(以屏蔽按键未例)_phonewindowmanager 屏灭 收不到按键消息-CSDN博客

KeyguardViewMeditor:整个锁屏的调度类,相当于锁屏的大脑,控制着整个锁屏。
KeyguardService:负责锁屏模块和PWM(PhoneWindowManageer.java)和PMS(PowerManagerService.java)之间的沟通。
KeyguardUpdateMonitor:负责将锁屏的状态传递下去
StatusBarKeyguardViewManager:负责View的管理
KeyguardBouncer:专门负责Bouncer界面也就是安全锁界面的管理。

注意点:对于锁屏来说,灭屏时,锁屏就会进行加载,并且加载完成,之后在亮屏时进行显示。

Power灭屏关联函数

PWM中的finishedGoingToSleep()、startedGoingToSleep()方法

./frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

 // Called on the PowerManager's Notifier thread.
    @Override
    public void startedGoingToSleep(int displayGroupId,
            @PowerManager.GoToSleepReason int pmSleepReason) {
        if (DEBUG_WAKEUP) {
            Slog.i(TAG, "Started going to sleep... (groupId=" + displayGroupId + " why="
                    + WindowManagerPolicyConstants.offReasonToString(
                            WindowManagerPolicyConstants.translateSleepReasonToOffReason(
                                    pmSleepReason)) + ")");
        }
        if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {
            return;
        }

        mRequestedOrSleepingDefaultDisplay = true;
        mIsGoingToSleepDefaultDisplay = true;

        // In case startedGoingToSleep is called after screenTurnedOff (the source caller is in
        // order but the methods run on different threads) and updateScreenOffSleepToken was
        // skipped. Then acquire sleep token if screen was off.
        if (!mDefaultDisplayPolicy.isScreenOnFully() && !mDefaultDisplayPolicy.isScreenOnEarly()
                && com.android.window.flags.Flags.skipSleepingWhenSwitchingDisplay()) {
            updateScreenOffSleepToken(true /* acquire */, false /* isSwappingDisplay */);
        }

        if (mKeyguardDelegate != null) {
            mKeyguardDelegate.onStartedGoingToSleep(pmSleepReason);
        }
    }   
    
// Called on the PowerManager's Notifier thread.
    @Override
    public void finishedGoingToSleep(int displayGroupId,
            @PowerManager.GoToSleepReason int pmSleepReason) {
        if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {
            return;
        }
        EventLogTags.writeScreenToggled(0);
        if (DEBUG_WAKEUP) {
            Slog.i(TAG, "Finished going to sleep... (groupId=" + displayGroupId + " why="
                    + WindowManagerPolicyConstants.offReasonToString(
                            WindowManagerPolicyConstants.translateSleepReasonToOffReason(
                                    pmSleepReason)) + ")");
        }
        MetricsLogger.histogram(mContext, "screen_timeout", mLockScreenTimeout / 1000);

        mRequestedOrSleepingDefaultDisplay = false;
        mIsGoingToSleepDefaultDisplay = false;
        mDefaultDisplayPolicy.setAwake(false);

        // We must get this work done here because the power manager will drop
        // the wake lock and let the system suspend once this function returns.
        synchronized (mLock) {
            updateWakeGestureListenerLp();
            updateLockScreenTimeout();
        }
        mDefaultDisplayRotation.updateOrientationListener();

        if (mKeyguardDelegate != null) {
        	//此处调用的是KeyguardServiceDelegate类中的onFinishedGoingToSleep方法,
            // 此类中直接调用的KeyguardService中的方法,所以直接看KeyGuardSeervice.
            mKeyguardDelegate.onFinishedGoingToSleep(pmSleepReason,
                    mCameraGestureTriggeredDuringGoingToSleep);
            
            // Unisoc bug 2526717: adapt screen off and on quickly by power button (1/2)
            if (pmSleepReason == PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON
                    && !mCameraGestureTriggeredDuringGoingToSleep) {
                setFinishedGoingToSleepByPowerButtonIfNeed();
            }
           
        }
        if (mDisplayFoldController != null) {
            mDisplayFoldController.finishedGoingToSleep();
        }
        mCameraGestureTriggeredDuringGoingToSleep = false;
        mCameraGestureTriggered = false;
    }

Power亮屏关联函数

亮屏时,KeyguardService先后会调用以下方法:onStartedWakeUp(),onScreenTurningOn(),onScreenTurnedOn(),锁屏亮屏显示布局的主要操作就在onScreenTurningOn()。

首先onScreenTurningOn在PWM中被调起,开始进行亮屏流程。

./frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
    
    // Called on the DisplayManager's DisplayPowerController thread.
    //在 DisplayManager 的 DisplayPowerController 线程上调用。
    @Override
    public void screenTurningOn(int displayId, final ScreenOnListener screenOnListener) {
        if (DEBUG_WAKEUP) Slog.i(TAG, "Display " + displayId + " turning on...");

        reportScreenTurningOnToWallpaper(displayId);
        if (displayId == DEFAULT_DISPLAY) {
            Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn",
                    0 /* cookie */);
            updateScreenOffSleepToken(false /* acquire */, false /* isSwappingDisplay */);
            mDefaultDisplayPolicy.screenTurningOn(screenOnListener);
            mBootAnimationDismissable = false;

            synchronized (mLock) {
                if (mKeyguardDelegate != null && mKeyguardDelegate.hasKeyguard()) {
                    mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);//移除掉消息队列中的绘制超时消息    
                    mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT,
                            getKeyguardDrawnTimeout());//获取绘制时长后,发送绘制超时消息,完成绘制  
                    mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback);//调用KeyguardServiceDelegate.onScreenTurningOn()方法
                } else {
                    if (DEBUG_WAKEUP) Slog.d(TAG,
                            "null mKeyguardDelegate: setting mKeyguardDrawComplete.");
                    mHandler.sendEmptyMessage(MSG_KEYGUARD_DRAWN_COMPLETE);
                }
            }
        } else {
            mScreenOnListeners.put(displayId, screenOnListener);

            Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER,
                    TRACE_WAIT_FOR_ALL_WINDOWS_DRAWN_METHOD, displayId /* cookie */);
            mWindowManagerInternal.waitForAllWindowsDrawn(mHandler.obtainMessage(
                    MSG_WINDOW_MANAGER_DRAWN_COMPLETE, displayId, 0),
                    WAITING_FOR_DRAWN_TIMEOUT, displayId);
        }
    }

    // Called on the DisplayManager's DisplayPowerController thread.
    @Override
    public void screenTurnedOn(int displayId) {
        if (DEBUG_WAKEUP) Slog.i(TAG, "Display " + displayId + " turned on...");

        // Unisoc: Notifies the window manager that screen is being turned On.
        // SR: SR.695.001864.006623, SR.695.000988.002914.
        // Bug: 2585814, 2586728 @{
        mWindowManagerFuncs.screenTurnedOn(displayId);
        // @}

        reportScreenTurnedOnToWallpaper(displayId);

        if (displayId != DEFAULT_DISPLAY) {
            return;
        }

        synchronized (mLock) {
            if (mKeyguardDelegate != null) {
                mKeyguardDelegate.onScreenTurnedOn();
            }
        }
        mDefaultDisplayPolicy.screenTurnedOn();
        reportScreenStateToVrManager(true);
    }

    @Override
    public void screenTurningOff(int displayId, ScreenOffListener screenOffListener) {
        mWindowManagerFuncs.screenTurningOff(displayId, screenOffListener);
        if (displayId != DEFAULT_DISPLAY) {
            return;
        }

        mRequestedOrSleepingDefaultDisplay = true;
        synchronized (mLock) {
            if (mKeyguardDelegate != null) {
                mKeyguardDelegate.onScreenTurningOff();
            }
        }
    }


// Called on the PowerManager's Notifier thread.
    @Override
    public void startedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) {
        if (DEBUG_WAKEUP) {
            Slog.i(TAG, "Started waking up... (groupId=" + displayGroupId + " why="
                    + WindowManagerPolicyConstants.onReasonToString(
                    WindowManagerPolicyConstants.translateWakeReasonToOnReason(
                            pmWakeReason)) + ")");
        }
        if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {
            return;
        }
        EventLogTags.writeScreenToggled(1);

        mIsGoingToSleepDefaultDisplay = false;
        mDefaultDisplayPolicy.setAwake(true);

        // Since goToSleep performs these functions synchronously, we must
        // do the same here.  We cannot post this work to a handler because
        // that might cause it to become reordered with respect to what
        // may happen in a future call to goToSleep.
        synchronized (mLock) {
            updateWakeGestureListenerLp();
            updateLockScreenTimeout();
        }
        mDefaultDisplayRotation.updateOrientationListener();

        if (mKeyguardDelegate != null) {
            mKeyguardDelegate.onStartedWakingUp(pmWakeReason, mCameraGestureTriggered);
        }

        mCameraGestureTriggered = false;

     
    }

    // Called on the PowerManager's Notifier thread.
    @Override
    public void finishedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) {
        if (DEBUG_WAKEUP) {
            Slog.i(TAG, "Finished waking up... (groupId=" + displayGroupId + " why="
                    + WindowManagerPolicyConstants.onReasonToString(
                            WindowManagerPolicyConstants.translateWakeReasonToOnReason(
                                    pmWakeReason)) + ")");
        }
        if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) {
            return;
        }

        if (mKeyguardDelegate != null) {
            mKeyguardDelegate.onFinishedWakingUp();
        }
        if (mDisplayFoldController != null) {
            mDisplayFoldController.finishedWakingUp();
        }
       
    }

DisplayPolicy

Android系统中DisplayPolicy.java的updateSystemBarAttributes函数主要负责更新系统栏(状态栏和导航栏)的显示属性。根据搜索结果分析,该函数的主要作用包括:

  1. 管理系统栏的可见性:控制状态栏和导航栏的显示或隐藏状态
  2. 调整系统栏的颜色:设置状态栏和导航栏的背景颜色
  3. 适配焦点窗口变化:当窗口焦点发生变化时,更新系统栏的属性以适应新的焦点窗口
    在Android系统中,DisplayPolicy是负责系统UI布局的关键组件,特别是导航栏和状态栏的布局管理。updateSystemBarAttributes函数作为其中的重要方法,确保了系统栏能够根据当前窗口状态和用户需求进行动态调整,提供更好的用户体验。

Android 12系统源码_SystemUI(七)DisplayPolicy构建状态栏和导航栏视图窗口区域坐标-CSDN博客

posted @ 2025-09-11 14:04  僵小七  阅读(28)  评论(0)    收藏  举报