Android中保持屏幕常亮的三种使用方法

news/2025/1/15 14:00:45/

目录

一、设置Flag

二、使用View类中的属性方法

1、Xml布局中设置:

2、功能代码中设置:

三、Wakelock 锁定机制

1、简介

2、作用

3、分类标志

4、使用方法

(1)在AndroidManifest.xml中设置权限

(2)通过PowerManager类获取WakeLock类的实例对象

(3)注意事项

(4)优化措施

(5)总结


一、设置Flag

这种方法官方推荐使用,最简单,不需要申请权限。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

二、使用View类中的属性方法

1、Xml布局中设置:

在主界面引用的xml文件中,找到顶层布局,添加以下属性:

android:keepScreenOn="true"  

2、功能代码中设置:

topLayout.setKeepScreenOn(true);

三、Wakelock 锁定机制

1、简介

在Android应用开发中,Wakelock被广泛应用于保持屏幕或CPU处于唤醒状态,以便应用程序可以继续执行后台任务,直到任务完成。 Wakelock是为了解决一些特定的应用场景而产生的概念,它的作用是保持屏幕、CPU或者一些其他机器状态继续运行,以满足一些特定的需求。

WakeLock是Android框架层提供的一套机制,应用使用该机制可以达到控制Android设备状态的目的。这里的设备状态主要指屏幕的打开关闭,CPU的保持运行。简单的理解WakeLock是让系统保持”清醒”的一种手段。

2、作用

在某些情况下,一些应用程序用户即使长时间不与其交互,也要阻止手机进入休眠状态。一个例子就是我们在看视频时,手机屏幕要保持开启状态。当手机灭屏状态下保持一段时间后,系统会进入休眠,一些后台运行的任务就可能得不到正常执行,比如网络下载中断,后台播放音乐暂停等。Android为此设计了WakeLock。WakeLock为了解决这类问题,应用只要申请了WakeLock,那么在释放WakeLock之前,系统不会进入休眠,即使在灭屏的状态下,应用要执行的任务依旧不会被系统打断。

  •  保持CPU处于唤醒状态,使得应用程序可以继续执行后台任务;
  •  保持屏幕处于唤醒状态,使得应用程序可以持续地向用户展示信息;
  •  保持设备处于唤醒状态,保证某些特定的任务可以得到正常执行。

Wakelock常用于以下场景中:

  • 音乐播放:当音乐应用程序正在播放时,它需要保持CPU处于唤醒状态,以便于音乐可以正常播放,并且保持屏幕处于唤醒状态,以便于用户可以查看当前播放曲目;
  • 后台任务:当应用程序需要在后台执行某些任务时,它需要保证CPU处于唤醒状态,以便于任务可以得到正常执行,并且可能需要保持屏幕处于唤醒状态,以便于用户可以获取某些信息;
  • 位置监听:当应用程序需要对设备的位置信息进行监听时,它需要保证CPU处于唤醒状态,以便于可以正确地获取设备的位置信息。

3、分类标志

  • 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后,屏幕不马上熄灭,保持屏幕亮起一段时间
  • UNIMPORTANT_FOR_LOGGING: 隐藏的flag,系统级别才会用到
  • DOZE_WAKE_LOCK/DRAW_WAKE_LOCK: 隐藏的分类,系统级别才会用到
  • PROXIMITY_SCREEN_OFF_WAKE_LOCK: 基于距离感应器熄灭屏幕。最典型的运用场景是我们贴近耳朵打电话时,屏幕会自动熄灭

4、使用方法

       WakeLock是PowerManager的内部类,其代码路径位于:

  frameworks/base/core/java/android/os/PowerManager.java

(1)在AndroidManifest.xml中设置权限
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
(2)通过PowerManager类获取WakeLock类的实例对象

         通常可以在onResume()中调用acquire()方法,在onPause()方法中调用release()方法。    

PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "tag:CpuKeepRunning");//或 执行 wakeLock.acquire();
wakeLock.acquire(1000 * 60);@Override  
protected void onResume() {  super.onResume();  //可以在onResume()中执行acquire()方法if (wakeLock!= null) {  wakeLock.acquire();  }  
}  @Override  
protected void onPause() {  super.onPause();  if (wakeLock!= null) {  wakeLock.release();  }  
}  
(3)注意事项
  • 官方已经不推荐使用这种方式保持亮屏,使用不当会让应用变成“电量杀手”,请尝试其他两种方式。
  • 申请WakeLock有两种方式:acquire()和acquire(long timeout),后者相对更安全点。如果忘记了release WakeLock,经过 timeout 的时长后,系统会自动release。一般情况下,使用完WakeLock需要尽快释放,如果忘记释放,很快就会耗光电量;
  • 为了防止出现问题,建议使用带超时的WakeLock.acquire()版本,它会在超过时限后释放WakeLock。比说,在播放视频时,可以使用视频的时长度作为超时时间,这样在视频播放完后就会自动释放WakeLock。我们通过源码可以看到,它的原理是在调用acquire()申请一个WakeLock的时候,通过Handler.postDelay()发送一个延迟消息来实现到达时间后自动释放的;
  • 请不要使用无限期的Wakelock,这会导致设备和应用程序在长时间内不休眠,最终会耗尽设备的电池;
  • 只有在必要的时候才使用SCREEN_ON、SCREEN_DIM、SCREEN_BRIGHT等类型的Wakelock,其他类型的Wakelock能够更好地满足应用程序的需求;
  • 尽可能地避免使用Wakelock,除非您的应用无法正常工作或无法完成所需的任务。
(4)优化措施

        当您使用Wakelock时,为了最大限度地减少对电池的耗电量,您可以执行以下优化措施:

  • 仅在需要时申请Wakelock,并且在任务完成后尽早释放它;
  • 使用标志,以便于检查设备是否处于唤醒状态,无需频繁地申请和释放Wakelock;
  • 优化Wakelock的使用,避免无效的唤醒操作,以便于减少对电池的耗电量;
  • 使用AlarmManager或JobScheduler等定时任务来代替Wakelock,以便于更好地保持电池寿命。

(5)总结

Android Wakelock是Android提供的一种锁定机制,能够保持设备处于唤醒状态,以便于应用程序可以在后台继续执行任务。 Wakelock的使用非常简单,只需要在需要保持唤醒状态的地方调用Wakelock.acquire()方法即可,当不需要保持唤醒状态时可以调用Wakelock.release()方法结束。 在使用Android Wakelock时,需要注意几个问题,如必须调用Wakelock.release()方法释放Wakelock、避免滥用Wakelock等。


http://www.ppmy.cn/news/983756.html

相关文章

陕西省工程师职称评审条件

专业建工类&#xff1a;工民建工程师、建筑工程师、建筑设计工程师、建筑装饰工程师、建筑施工工程师、建筑管理工程师、建筑水电安装工程师、工民建安装工程师、给排水工程师、土木工程工程师、土木建筑工程师、造价工程师、测量工程师、结构工程师、暖通工程师、安全工程师、…

常见内网穿透工具,收好了!

前言 本文以渗透的视角&#xff0c;总结几种个人常用的内网穿透&#xff0c;内网代理工具&#xff0c;介绍其简单原理和使用方法。 1. nps-npc 1.1 简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发&#xff0c;可支持任何tcp、udp上层协…

Ubuntu 安装 MinIO

MinIO是一个开源的高性能对象存储解决方案&#xff0c;支持多种安装方式&#xff0c;本例仅介绍最基础的单机安装方式。 一&#xff1a;下载安装文件 直接从MinIO官网下载安装文件。 1.1 下载服务端 wget https://dl.min.io/server/minio/release/linux-amd64/minio 1.2 将…

【电压和电压稳定指数研究】带多台配电发电机 (DG) 的径向配电系统研究【IEEE33节点】(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 电压和电压稳定指数研究是关于电力系统中电压水平和其稳定性的研究。电力系统中的电压是指电网中的电压水平&#xff0c;通常以相电压&#xf…

Spring(10) 生成和替换Banner启动图案

目录 1.背景2.推荐网站3.如何集成到spring项目中4.效果展示 1.背景 我们在启动 Spring 项目的时候经常会看到一个 Spring 字样的启动图案。如下所示&#xff1a; 如果我们也想根据我们的内容生成这样的图案&#xff0c;应该怎么操作呢&#xff1f; 2.推荐网站 可以生成这种图…

【Vue3】computed 计算属性

computed 基础语法 <template><div><div>性&#xff1a;<input v-model"firstName" type"text"></div><div>名&#xff1a;<input v-model"lastName" type"text"></div><div>…

go-zero学习 第七章 运维部署

go-zero学习 第七章 运维部署 1 参考文档 待编写。。。 1 参考文档 部署准备&#xff08;环境&#xff09;

[SQL挖掘机] - 多表连接: union

介绍: sql中的union是用于合并两个或多个select语句的结果集的操作符。它将多个查询的结果合并成一个结果集&#xff0c;并自动去除重复的行。请注意&#xff0c;union操作要求被合并的查询返回相同数量和类型的列。 用法: union的基本语法如下&#xff1a; select_stateme…