手机常亮屏不自动灭屏

一. 基础知识介绍

 1. WakeLock(休眠锁)

WakeLock用于保持设备的唤醒状态,有些情况下,即时用户不操作App,我们也需要保持屏幕处于唤醒状态,以保证用户体验,比如视频类APP和计步类APP,视频类APP需要屏幕一直保持常量,计步类APP要求熄屏后程序依然保持运行状态。

2. WakeLock的多种类型:

PARTIAL_WAKE_LOCK:保持CPU正常运转,但屏幕和键盘灯都可能是关闭的。
SCREEN_DIM_WAKE_LOCK:保持CPU正常运转,允许屏幕点亮但可能屏幕被置灰,键盘灯可能是关闭的。
SCREEN_BRIGHT_WAKE_LOCK:保持CPU正常运转,允许屏幕高亮显示,键盘灯可能是关闭的。
FULL_WAKE_LOCK:保持CPU正常运转,保持屏幕高亮显示,键盘灯也保持亮度。
ACQUIRE_CAUSES_WAKEUP:强制屏幕和键盘灯亮起,这种锁针对一些必须通知用户的操作。
ON_AFTER_RELEASE:当WakeLock被释放后,继续保持屏幕和键盘灯亮起一段时间。

二. 遇到不灭屏的解决方法

1. 方法一

   使用adb shell dumpsys >dumpsys.txt
   或者在bugreport.zip
   或者使用命令: adb shell dumpsys power > power_dump.txt

   搜索关键字:Wake Locks: 查看对应的持有对象。

实例分析:

1. 案例一

   复现场景:

   [settings]settings->display->screen timeout-设置15秒,15秒后手机不灭屏.(低概率)

(1) 查看dump power的信息:

Wake Locks: size=1 FULL_WAKE_LOCK 'TinnoFactory' ACQUIRE_CAUSES_WAKEUP ACQ=-55m1s400ms (uid=1000 pid=16340)

(2) 发现有持有'TinnoFactory'  TAG的 wake lock (FULL_WAKE_LOCK)导致不能灭屏。

(3) 查看代码:

    private static final String TAG = "TinnoFactory"; 
   /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "<TinnoFactoryActivity> onCreate");

        PowerManager pm =(PowerManager) getSystemService(POWER_SERVICE); 
            wakeLock= pm.newWakeLock(PowerManager.FULL_WAKE_LOCK| PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
            wakeLock.acquire();

    @Override
    public void onDestroy() {
        Log.d(TAG, "<TinnoFactoryActivity> onDestroy");
//        Log.i(TAG, "onDestroy, reset previousMobileDataState");
//        setMobileDataState(mPreviousMobileDataState);
//        Log.i(TAG, "setMobileData, getMobileDataState = " + getMobileDataState());
        if (wakeLock != null) {wakeLock.release();}
        super.onDestroy();
    }

(4)  这个应用退出来就可以恢复。

2. 案例二

 复现场景:

将timeout 时间设置为15秒。在打电话界面停留超过15秒,手机不灭屏。

(1) 查看dump power的信息: 

 SCREEN_BRIGHT_WAKE_LOCK        'WindowManager' ON_AFTER_RELEASE ACQ=-1m56s271ms (uid=1000 pid=1344 ws=WorkSource{10172})

 (2) 发现有持有'WindowManager'  TAG,是来自uid: 10172, 通过日志发现10172是dialer应用。

 (3) 分析'WindowManager'  TAG,怎么持有wake lock。

  使用倒序的方法找:

 1) TAG 定义:  

TAG_WM 定义:

frameworks/base/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java

public class WindowManagerDebugConfig {
...
    static final String TAG_WM = "WindowManager";
..

 2)  调用newWakeLock SCREEN_BRIGHT_WAKE_LOCK的地方:

frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

    private WindowManagerService(Context context, InputManagerService inputManager,
            boolean showBootMsgs, boolean onlyCore, WindowManagerPolicy policy,
            ActivityTaskManagerService atm, DisplayWindowSettingsProvider
            displayWindowSettingsProvider, Supplier<SurfaceControl.Transaction> transactionFactory,
            Supplier<Surface> surfaceFactory,
            Function<SurfaceSession, SurfaceControl.Builder> surfaceControlFactory) {
...
        mHoldingScreenWakeLock = mPowerManager.newWakeLock(
                PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG_WM);

...
}

 3)谁在使用mHoldingScreenWakeLock.

只要newHoldScreen不为null,若调用setHoldScreenLocked,则就会调用acquire函数.

    void setHoldScreenLocked(final Session newHoldScreen) {
        final boolean hold = newHoldScreen != null;
...
        if (hold != state) {
            if (hold) {
                mHoldingScreenWakeLock.acquire();
                mPolicy.keepScreenOnStartedLw();
            }

..

 4) 接下来寻找是调用setHoldScreenLocked 函数

   发现只有一处,是在RootWindowContainer.java 中。

frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
 

    // "Something has changed!  Let's make it correct now."
    // TODO: Super long method that should be broken down...
    void performSurfacePlacementNoTrace() {
...
        mWmService.setHoldScreenLocked(mHoldScreen);

..

5) 查看是谁给mHoldScreen赋值。

也是只有一处,当设置flag是FLAG_KEEP_SCREEN_ON。

android/frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java 


    /**
     * @param w        WindowState this method is applied to.
     * @param obscured True if there is a window on top of this obscuring the display.
     * @param syswin   System window?
     * @return True when the display contains content to show the user. When false, the display
     * manager may choose to mirror or blank the display.
     */
    boolean handleNotObscuredLocked(WindowState w, boolean obscured, boolean syswin) {
        if (w.mHasSurface && canBeSeen) {
            if ((attrFlags & FLAG_KEEP_SCREEN_ON) != 0) {
                mHoldScreen = w.mSession;
                mHoldScreenWindow = w;
            } 

(4) 在dialer 中查看是谁使用了FLAG_KEEP_SCREEN_ON 。

   果真有有相应的代码,进行debug调试既可.

vendor/mediatek/proprietary/packages/apps/Dialer/java/com/android/incallui/InCallPresenter.java

  private void applyScreenTimeout() {

    if (screenTimeoutEnabled) {
      window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    } else {
      window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/667655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT高效提问—基础知识(LM、PLM以及LLM)

ChatGPT高效提问—基础知识&#xff08;LM、PLM以及LLM&#xff09; ​ 了解语言模型&#xff08;language model, LM&#xff09;、预训练语言模型&#xff08;pre-trained language model, PLM&#xff09;和大型语言模型&#xff08;large language model, LLM&#xff09;…

Linux 系统安装Allure

要在 Linux 系统上进行离线安装 Allure 命令行工具&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 在具有互联网连接的计算机上下载 Allure 的二进制压缩包。 可以从 Allure 的官方 GitHub 仓库&#xff08;https://github.com/allure-framework/allure2/releases&…

flutter开发实战-ijkplayer视频播放器功能

flutter开发实战-ijkplayer视频播放器功能 使用better_player播放器进行播放视频时候&#xff0c;在Android上会出现解码失败的问题&#xff0c;better_player使用的是video_player&#xff0c;video_player很多视频无法解码。最终采用ijkplayer播放器插件&#xff0c;在flutt…

3D力导向树插件-3d-force-graph学习001

一、引入文件&#xff1a;下载静态js文件引入 1、**以vue项目测试&#xff0c;在index.html文件中引入静态文件&#xff08;js文件可在官网下载&#xff09;** 2、**也曾尝试用npm包下载引入的方法&#xff0c;总是会有报错&#xff0c;所以采用静态js文件引入的方式** 二、基…

git如何将分支名由main改为master

要将分支名从 “main” 改为 “master”&#xff0c;请按照以下步骤操作&#xff1a; 首先&#xff0c;确保你已经在要重命名的分支上。通常&#xff0c;这是 “main” 分支。要检查当前分支&#xff0c;请运行以下命令&#xff1a; git branch这将显示所有本地分支&#xff…

【高质量精品】2024美赛B题22页word版高质量半成品论文+多版保奖思路+数据+前四问思路代码等(后续会更新)

一定要点击文末的卡片&#xff0c;进入后&#xff0c;获取完整论文&#xff01;&#xff01; B 题整体模型构建 1. 潜水器动力系统失效&#xff1a;模型需要考虑潜水器在无推进力情况下的行为。 2. 失去与主船通信&#xff1a;考虑无法从主船接收指令或发送位置信息的情况。…

【AIGC核心技术剖析】DreamCraft3D一种层次化的3D内容生成方法

DreamCraft3D是一种用于生成高保真、连贯3D对象的层次化3D内容生成方法。它利用2D参考图像引导几何塑造和纹理增强阶段&#xff0c;通过视角相关扩散模型执行得分蒸馏采样&#xff0c;解决了现有方法中存在的一致性问题。使用Bootstrapped Score Distillation来提高纹理&#x…

LabVIEW与EtherCAT实现风洞安全联锁及状态监测

LabVIEW与EtherCAT实现风洞安全联锁及状态监测 在现代风洞试验中&#xff0c;安全联锁与状态监测系统发挥着至关重要的作用&#xff0c;确保了试验过程的安全性与高效性。介绍了一套基于EtherCAT总线技术和LabVIEW软件开发的风洞安全联锁及状态监测系统。该系统通过实时、可靠…

jmeter-04创建请求

文章目录 一、发送请求-查看响应流程二、新建请求三、选择请求方式&#xff0c;填写url1.发送get请求当只有请求方式不一样的时候&#xff0c;参数都填写在参数栏里面&#xff0c;GET请求与POST请求的区别&#xff1f; 2.发送post请求2.1 application/x-www-form-urlencoded2.2…

鸿蒙4.0.0 安装minitouch

鸿蒙4.0.0 安装minitouch ubuntu 系统 minitouch 地址 https://github.com/DeviceFarmer/minitouch 因为 鸿蒙4.0.0 对应安卓12 API版本31 所以启动 minitouch 需要 STFService 地址 https://github.com/openstf/STFService.apk 到release下载最新的STFService.apk &…

基于深度学习的SSVEP分类算法简介

基于深度学习的SSVEP分类算法简介 1、目标与范畴2、深度学习的算法介绍3、参考文献 1、目标与范畴 稳态视觉诱发电位&#xff08;SSVEP&#xff09;是指当受试者持续注视固定频率的闪光或翻转刺激时&#xff0c;在大脑枕-额叶区域诱发的与刺激频率相关的电生理信号。与P300、运…

C系列-柔性数组

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 ​编辑 柔性数组 柔性数组的特点 柔性数组的使用 柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组这个概念&#xff0c;但是它确实是存在的&#xff0c;C99中&#…

vue学习——集成sass

安装 pnpm i sass sass-loader -D在vite.config.ts文件配置: export default defineConfig({css: {preprocessorOptions: {scss: {javascriptEnabled: true,additionalData: import "./src/styles/variable.scss";,},},},} }创建三个文件 src/styles/index.scss //…

PyTorch 2.2 中文官方教程(十八)

开始使用完全分片数据并行&#xff08;FSDP&#xff09; 原文&#xff1a;pytorch.org/tutorials/intermediate/FSDP_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Hamid Shojanazeri&#xff0c;Yanli Zhao&#xff0c;Shen Li 注意…

Hudi学习 6:Hudi使用

准备工作&#xff1a; 1.安装hdfs https://mp.csdn.net/mp_blog/creation/editor/109689143 2.安装spark spark学习4&#xff1a;spark安装_hzp666的博客-CSDN博客 3.安装Scala Hudi学习6&#xff1a;安装和基本操作_hzp666的博客-CSDN博客 spark-shell 写入和读取hudi 2.…

python常用pandas函数nlargest / nsmallest及其手动实现

目录 pandas库 Series和DataFrame nlargest和nsmallest 用法示例 代替方法 手动实现 模拟代码 pandas库 是Python中一个非常强大的数据处理库,提供了高效的数据分析方法和数据结构。它特别适用于处理具有关系型数据或带标签数据的情况,同时在时间序列分析方面也有着出…

Springboot mybatis关于bean中含有表中不存在的字段

1、当使用mybatis plus时&#xff0c;可用TableField(exist false) Data TableName("comp_sta_scale_t") public class Scale implements Serializable {/*** 唯一主键*/TableIdprivate String id;/*** 资源id*/Excel(name "资源id", mergeVertical tr…

基于springboot地方美食分享网站源码和论文

基于springboot地方美食分享网站源码和论文361 首先&#xff0c;论文一开始便是清楚的论述了系统的研究内容。其次&#xff0c;剖析系统需求分析&#xff0c;弄明白“做什么”&#xff0c;分析包括业务分析和业务流程的分析以及用例分析&#xff0c;更进一步明确系统的需求。然…

嵌入式中经典面试题分析

1.关键字static的作用是什么&#xff1f;为什么static变量只初始化一次&#xff1f; 1&#xff09;修饰局部变量&#xff1a;使得变量变成静态变量&#xff0c;存储在静态区&#xff0c;存储在静态区的数据周期和程序相同&#xff0c; 在main函数开始前初始化&#xff0c;在退…

7min到40s:SpringBoot 启动优化实践!

目录 背景 1 耗时问题排查 1.1 观察 SpringBoot 启动 run 方法 1.2 监控 Bean 注入耗时 2 优化方案 2.1 如何解决扫描路径过多&#xff1f; 2.2 如何解决 Bean 初始化高耗时&#xff1f; 3 新的问题 3.1 SpringBoot 自动化装配&#xff0c;让人防不胜防 3.2 使用 sta…