Android 7.1 亮度调节完整流程分析(三)

Android 7.1 亮度调节完整流程分析(三)

上一篇说到DisplayManagerService.LocalService中blanker的requestDisplayState调用了requestGlobalDisplayStateInternal,即下图中第19步:
在这里插入图片描述
那么我们继续分析requestGlobalDisplayStateInternal:

private void requestGlobalDisplayStateInternal(int state, int brightness) {
   
        if (state == Display.STATE_UNKNOWN) {
   
            state = Display.STATE_ON;
        }
        if (state == Display.STATE_OFF) {
   
            brightness = PowerManager.BRIGHTNESS_OFF;
        } else if (brightness < 0) {
   
            brightness = PowerManager.BRIGHTNESS_DEFAULT;
        } else if (brightness > PowerManager.BRIGHTNESS_ON) {
   
            brightness = PowerManager.BRIGHTNESS_ON;
        }

        synchronized (mTempDisplayStateWorkQueue) {
   
            try {
   
                // Update the display state within the lock.
                // Note that we do not need to schedule traversals here although it
                // may happen as a side-effect of displays changing state.
                synchronized (mSyncRoot) {
   
                    if (mGlobalDisplayState == state
                            && mGlobalDisplayBrightness == brightness) {
   
                        return; // no change
                    }

                    Trace.traceBegin(Trace.TRACE_TAG_POWER, "requestGlobalDisplayState("
                            + Display.stateToString(state)
                            + ", brightness=" + brightness + ")");
                    mGlobalDisplayState = state;
                    mGlobalDisplayBrightness = brightness;
                    applyGlobalDisplayStateLocked(mTempDisplayStateWorkQueue);//1
                }

                // Setting the display power state can take hundreds of milliseconds
                // to complete so we defer the most expensive part of the work until
                // after we have exited the critical section to avoid blocking other
                // threads for a long time.
                for (int i = 0; i < mTempDisplayStateWorkQueue.size(); i++) {
   
                    mTempDisplayStateWorkQueue.get(i).run();//2
                }
                Trace.traceEnd(Trace.TRACE_TAG_POWER);
            } finally {
   
                mTempDisplayStateWorkQueue.clear();
            }
        }
    }

标记1处就runnable加入了队列mTempDisplayStateWorkQueue,标记2处执行runnable。关键的步骤是在标记1处完成,耗时的部分在标记2处完成。看一下标记1处加入了什么runnable:

private void applyGlobalDisplayStateLocked(List<Runnable> workQueue) {
   
        final int count = mDisplayDevices.<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值