问题背景
在android OTT产品中有一个功能为屏幕保护程序(Screen Saver),该功能在各种电子产品的屏幕空闲(即用户不进行任何操作)时,通过显示移动的图片或图案来防止屏幕因长时间静止显示同一画面而导致的老化或损坏。无操作后屏保启动的时间是可以选择的,现在是在setting应用程序内部写死几个值给用户进行选择,即不是用户自定义的。在OTT开发过程中遇到需新增或者修改屏保启动时间的需求,以及到时间后屏保没有启动的问题。
问题分析与解决
将屏保定时新增或者修改其他时间
OTT的屏保时间一般都在setting中进行预设几个常见值,以供用户选择。这些值在setting代码arrays.xml文件的关于dream的字符串数组中,例如增加1分钟和5分钟休眠的选项,如下所示,其中dream_timeout_values表示的ms:
<string-array name="dream_timeout_entries">
+ <item>1 minutes</item>
+ <item>5 minutes</item>
<item>15 minutes</item>
<item>30 hour</item>
<item>1 hours</item>
<item>Never</item>
</string-array>
<string-array name="dream_timeout_values" translatable="false">
+ <item>60000</item>
+ <item>300000</item>
<item>900000</item>
<item>1800000</item>
<item>3600000</item>
<item>2147483647</item>
</string-array>
屏保到时间后没有正常启动
通过日志可以查看到屏保启动时,走的流程是PowerManagerService.java中的dreaming...,并启动预设的屏保web程序。
08-28 17:16:30.055 483 527 I PowerManagerService: Napping display group (groupId=0, uid=1000)...
08-28 17:16:30.055 483 527 I PowerManagerService: Nap time (uid 1000)...
08-28 17:16:30.057 483 527 I DreamManagerService: Entering dreamland.
08-28 17:16:30.058 483 527 I PowerManagerService: Dreaming...
08-28 17:16:30.062 483 502 I DreamController: Starting dream: name=ComponentInfo{com.android.dreams.web/com.android.dreams.web.Screensaver}, isTest=false, canDoze=false, userId=0
通过梳理代码可知,关键函数为:shouldNapAtBedTimeLocked,
/**
如果设备应在用户活动超时已过并且到了就寝时间时自动小睡并开始做梦,则返回 true
*/
@GuardedBy("mLock")
private boolean shouldNapAtBedTimeLocked() {
return mDreamsActivateOnSleepSetting
|| (mDreamsActivateOnDockSetting
&& mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED);
}
进一步梳理其调用关系可知,关键变量为config_dreamsActivatedOnSleepByDefault,将设置为true即可,保证定时启动屏保。
这里的做法是在方案配置目录中将该值设置为true,如下所示:
config.xml文件中
<bool name="config_dreamsActivatedOnSleepByDefault">true</bool>