当前位置: 首页 > news >正文

MTK-Android12-13 屏幕永不休眠功能实现

MTK-Android12-13 屏幕永不休眠功能实现

文章目录

  • 需求
  • 场景
  • 参考资料
  • 修改文件
    • 简要分析
    • 实现方案
      • 默认休眠时间设置 def_screen_off_timeout
      • 息屏时间添加永不休眠 screen_timeout_entries
      • 更新休眠时间 updateUserActivitySummaryLocked
  • 总结


需求

屏幕永不休眠功能

备注:前面正好讲到过 修改屏幕息屏时间,这里新增一个小的需求,新增屏幕永不休眠选项
在接触的 Android12/13 版本产品,系统默认是没有永不休眠功能的

场景

广告机、商显设备、展示设备 要求屏幕默认常亮或者有永不休眠功能
比如如下在设置选项里面需要有一个永不休眠的选项

在这里插入图片描述

参考资料

MTK-Android12-13 修改默认息屏时间
Android 屏保功能实现
PowerManagerService 进入屏保 updateUserActivitySummaryLocked
PowerManagerService分析-updatePowerStateLocked方法
PowerManagerService之自动灭屏

前面正好涉及到 修改屏幕默认息屏时间、屏保功能定制实现,和当前需求有所关联。 在设置里面更改UI组件、加载 添加的永不休眠功能后,最终是需要再PowerManagerService 里面实现永不休眠功能逻辑的呀。

修改文件

/vendor/mediatek\proprietary/packages/apps/SettingsProvider/res/values/defaults.xml 
/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/arrays.xml
/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/arrays.xml
/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

简要分析

如上参考资料,特别是之前实现的部分需求 修改息屏默认时间及屏保功能实现,分析如下:

  • defaults.xml 修改默认息屏时间 属性def_screen_off_timeout,可以设置为0 或者 -1
    或者任意你想设置的值 对应永不休眠的值,表示息屏时间默认值。
  • arrays.xml
    修改属性dream_timeout_entries,如修改息屏默认时间分析的内容,系统设置中息屏时间界面加载数据源,那就在这里添加
  • PowerManagerService.java 如屏保功能分析和其它相关资料参考,在更新休眠时间的地方,不让更新即可实现需求

实现方案

默认休眠时间设置 def_screen_off_timeout

这里设置为0 
<integer name="def_screen_off_timeout">0</integer>

息屏时间添加永不休眠 screen_timeout_entries

    <!-- Display settings.  The delay in inactivity before the dream is shown. These are shown in a list dialog. -->
    <string-array name="dream_timeout_entries">
        <item>Never</item>
        <item>15 seconds</item>
        <item>30 seconds</item>
        <item>1 minute</item>
        <item>2 minutes</item>
        <item>5 minutes</item>
        <item>10 minutes</item>
        <item>30 minutes</item>
    </string-array>
	
  <string-array name="screen_timeout_entries">
    <item msgid="8386012403457852396">"15 秒"</item>
    <item msgid="4572123773028439079">"30 秒"</item>
    <item msgid="7016081293774377048">"1 分钟"</item>
    <item msgid="838575533670111144">"2 分钟"</item>
    <item msgid="2693197579676214668">"5 分钟"</item>
    <item msgid="1955784331962974678">"10 分钟"</item>
    <item msgid="5578717731965793584">"30 分钟"</item>
        <item>"永不休眠"</item>
  </string-array>

更新休眠时间 updateUserActivitySummaryLocked

看方法注释,就是用来计算一个系统是否进入dim or bright 的状态

/**
     * Updates the value of mUserActivitySummary to summarize the user requested
     * state of the system such as whether the screen should be bright or dim.
     * Note that user activity is ignored when the system is asleep.
     *
     * This function must have no other side-effects.
     */
    private void updateUserActivitySummaryLocked(long now, int dirty) {


   .....
   }

在这个方法里面,我们来判断当前设置的time 值,来判断是否进行 时间计算就可以了。

  if (mScreenOffTimeoutSetting != 0) {
                    
                    if ((groupUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0
                            && (mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked(groupId)
                            & WAKE_LOCK_STAY_AWAKE) == 0) {
                        groupNextTimeout = mAttentionDetector.updateUserActivity(groupNextTimeout,
                                screenDimDuration);
                    }

                    hasUserActivitySummary |= groupUserActivitySummary != 0;

                    if (nextTimeout == -1) {
                        nextTimeout = groupNextTimeout;
                    } else if (groupNextTimeout != -1) {
                        nextTimeout = Math.min(nextTimeout, groupNextTimeout);
                    }
                }else {
                    groupUserActivitySummary |= USER_ACTIVITY_SCREEN_BRIGHT;
                 }


mScreenOffTimeoutSetting 是什么,看PowerManagerService 里面变量的声明如下:

      mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver,
                Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT,
                UserHandle.USER_CURRENT);


总结

  • 这里重点是PMS 在息屏时间上面的一个功能分析
  • 关联到PMS 里面实现的另外一个功能 屏保功能 都是跟息屏相关,部分逻辑业务关联的
  • 对于默认息屏时间,这里属于新增息屏时间选项的一个功能。 如果需要新增其它息屏时间选项,只需要在修改息屏时间源即可 就 不需要修改PMS了。

相关文章:

  • 落子宜宾:全方位解析树莓集团现状布局
  • Vue3+Vite+TypeScript+Element Plus开发-06.Header响应式菜单缩展
  • AIDD-人工智能药物设计-TCMP-12个公开的中药数据库
  • window上 docker使用ros2开发并usbip共享usb设备
  • C# 中的 nameof 表达式:用法详解与最佳实践
  • Vue3 + Vite + TS,使用 Web Worker,web worker进阶 hooks
  • Qt中自定义插件和库(1)
  • 深入理解Docker Bridge网络模式:原理与实践指南
  • leetcode_203. 移除链表元素_java
  • 网络安全法规与入门指南
  • 【Android Studio】第一个Android程序 运行流程 程序调试 | 实操实战图文详细
  • net9.0 中System.Text.Json序列化和反序列化
  • spring-cloud-starter-dubbo使用说明
  • TypeScript:从类型工具到前端系统设计的跃迁
  • Python和MicroPython的解释器区别
  • 【算法学习计划】回溯 -- 综合题目(上)
  • 深入理解 Handler、Looper 、 MessageQueue和 HandlerThread
  • LINUX的使用(1)-挂载云硬盘
  • setInterval问题以及前端如何实现精确的倒计时
  • Error 1062 (23000): Duplicate entry ‘‘ for key ‘id‘`
  • 怎么用WordPress快速建站/电商运营的基本内容
  • 常州网站建设开发/武汉搜索排名提升
  • 网站跳转到另外一个网站怎么做/好网站制作公司
  • 申请做网站编辑组长的工作设想/南昌seo招聘信息
  • 网站备案承诺书怎么写/精准营销方式有哪些
  • 网站上线盈利/上海网站seoseodian