Android7.1 Kyguard界面灭屏时间分析

概述

      在Android系统中,当用户没有操作手机一段时间后,系统会自动灭屏进入休眠状态,从而降低手机功耗。一般情况下系统灭屏的时间由用户在手机设置中自己进行定义是10s30s还是1min等等。但是如果现在系统当前显示的是锁屏界面,不论用户在设置中定义的屏幕超时时间是多少,此时超时时间默认都是10s。而为何在锁屏界面屏幕超时时间都是10s,又是如何设置的呢?就是本文需要分析的问题。

系统灭屏分析

    在开始本文分析之前需要先将PowerManagerService自动灭屏流程大概的梳理一下,详细的Power流程请参考之前分析的(Android7.0 PowerManagerService亮灭屏分析)系列文档

      首先从PowerManagerService的核心函数updatePowerStateLocked入手,该函数用来更新全局电源状态。其实在PMS中很多函数都只是对一些必须的属性进行赋值,大部分最终都会调用到updatePowerStateLocked函数中进行功能执行,其中更新电源状态主要依据就是变量mDirtymDirty就是用来记录power state的变化的标记位,这样的状态变化在系统中一共定义了12个,每一个状态对应一个固定的数字,都是2的倍数。这样,若有多个状态一块变化,进行按位取或这样结果既是唯一的,又能准确标记出各个状态的变化。

      在updatePowerStateLocked函数中会调用另外一个函数获取屏幕的超时时间,该函数就是updateUserActivitySummaryLocked更新屏幕超时时间。


    使用下面图例有助于快速理解,通过屏幕超时时间,上一次用户事件以及dim时长与当前的时间进行对比,从而来计算此时屏幕的状态,是高亮,DIM还是灭屏状态。如果计算出下次屏幕的超时时间后,发送一个Handler消息,到了超时时间屏幕就会熄灭。


所以屏幕的超时时间就决定了何时灭屏,此时就要分析一下screenOffTimeout是如何获得的。

获取屏幕超时时间

     获取屏幕超时时间是在PowerManagerService中的getScreenOffTimeoutLocked函数中获取的。

      根据代码可以看出首先会将mScreenOffTimeoutSetting的值赋值给timeoutmScreenOffTimeoutSetting的值就是在systemReady完成后更新Setting数据库,从数据库中获取到的,也就是用户在setting中自定义的超时时间。

下面可能会有四种情况导致在设置中定义的屏幕超时时间不起作用。

1.管理员强制设置超时时间

2.WindowManager重新设置超时时间

3.sleepTimeout大于等于零

resource中配置的config_minimumScreenOffTimeoutSetting中定义的值大。

    当显示锁屏界面时就是采用的第二种情况WindowManager重新设置超时时间为mUserActivityTimeoutOverrideFromWindowManager。该值是调用Power接口setUserActivityTimeoutOverrideFromWindowManager设置的。


WMS调用Power设置超时间


      在亮屏的时候需要对StatusBar进行绘制,绘制动作在ViewRootImpldraw函数中,当绘制完成后通过Session.java调用到WMS中结束绘制,经过一系列函数调用在handleNotObscuredLocked函数中将StatusBar中的超时时间赋值给mUserActivityTimeout

根据函数看出只有w.mHasSurfacecanBeSeen都为true才可以继续向下执行。canBeSeen的值是在WindowState中获取的


     所以只有windows绘制完成canBeSeen才可能是true,也就是StatusBar绘制完成后handleNotObscuredLocked函数才可以向下执行。并且StatusBar中的参数userActivityTimout的值大于等于0才可以赋值给mUserActivityTimeout。之后调用PowersetUserActivityTimeoutOverrideFromWindowManager接口讲mUserActivityTimeout传递给PowerManagerService

下面继续分析的StatusBar中的userActivityTimout是如何设置的?设置的值又是多少?

StatusBar设置超时时间


    当开机第一次显示keyguard或者灭屏reset keyguard的时候StatusBarWindowManager会调用applyUserActivityTimeout函数进行设置userActivityTimout


    如果此时StatusBar状态为keyguard,并且keyguard正在显示没有被阻塞,就会将AWAKE_INTERVAL_DEFAULT_MS赋值给userActivityTimout


      AWAKE_INTERVAL_DEFAULT_MS默认值为10s,也就是说在keyguard界面默认超时时间为10s,如果需要延长在keyguard界面灭屏时间,只需要修改这个值就可以了。

猜你喜欢

转载自blog.csdn.net/fu_kevin0606/article/details/79420123