保持屏幕唤醒的几种方式总结

1.通过WakeLock的方式

首先设置唤醒锁的权限
<uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-permission android:name="android.permission.DEVICE_POWER"/>

代码示例:

private PowerManager.WakeLock mWakeLock;

private void acquireWakeLock() {
    if (mWakeLock == null) {
        PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, TAG);
    }

    //建议计数模式设置为true
    mWakeLock.setReferenceCounted(false);
    mWakeLock.acquire(60 * 1000);
}

private void releaseWakeLock() {
    if (mWakeLock.isHeld()) mWakeLock.release();
}`

总结:

  • 尽量使用 acquire(long timeout) 设置超时, (也被称作超时锁). 例如网络请求的数据返回时间不确定, 导致本来只需要10s的事情一直等待了1个小时, 这样会使得电量白白浪费了. 设置超时之后, 会自动释放已节省点远.
  • 建议计数模式setReferenceCounted()设置为true,这样调用一次 release() 就会释放所有锁。
  • 兼容性问题:PowerManager.SCREEN_DIM_WAKE_LOCK模式已经在废弃。

2.通过window的flag属性设置

示例代码:

private void acquireWakeLock(Activity activity) {
    if (activity != null && activity.getWindow() != null) {
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
}

private void releaseWakeLock(Activity activity) {
    if (activity != null && activity.getWindow() != null) {
        activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
}

`

3.通过设置View的属性

在布局文件里加上

android:keepScreenOn="true"

总结:

  • 兼容性:采用window的flag的方式的兼容性更广
  • Api的友好性:可以手动进行管理屏幕的唤醒与否

    综合比较选择window的flag方式。

参考文章:
https://blog.youkuaiyun.com/a57565587/article/details/51669520/
https://www.jianshu.com/p/48ed37738a9e/

<think>好的,用户问的是如何在Android上设置屏幕常亮,可能他们需要让屏幕保持开启状态,避免自动锁屏。首先,我需要确认用户的使用场景,可能是在阅读、演示或者需要长时间查看屏幕的情况下使用。接下来,用户可能不太清楚具体有哪些方法可以实现,所以需要分几种情况来介绍。 首先,系统自带的开发者选项里有一个“保持唤醒”选项,这可能是最直接的方法。但用户可能不知道如何开启开发者选项,所以需要详细说明步骤。另外,这个方法只在充电时有效,这点很重要,必须明确告知用户限制条件。 其次,用户可能没有root权限,或者不想使用开发者选项,所以需要介绍第三方应用的方法。比如使用Caffeinate这样的应用,但需要提醒用户注意应用权限和安全性,避免下载不可信的软件。 另外,如果是开发者的话,可能需要在应用中集成屏幕常亮的功能,这时候需要提供代码示例,比如在Activity中设置FLAG_KEEP_SCREEN_ON。这部分用户可能是开发者,需要更技术性的指导,但也要确保解释清楚代码的作用和使用方法。 用户还可能关心是否需要root权限,比如使用adb命令的情况。这时需要解释adb命令的具体操作,以及这些命令是否需要设备有root权限。比如通过adb设置超时时间,可能不需要root,但需要USB调试权限,这也需要用户开启开发者选项,可能有些复杂,但可以详细说明步骤。 还要考虑不同Android版本的差异,某些方法可能在旧版本上不可用,或者需要不同的操作步骤。需要提醒用户注意系统版本,并提供替代方案。 最后,用户可能担心长时间开启屏幕会影响设备寿命或耗电,所以需要给出注意事项,比如建议连接充电器,避免在不需要时长时间使用等。同时,安全方面也要提醒,使用第三方应用时要注意权限和来源。 总结来说,用户的需求是设置屏幕常亮,但可能有不同的使用场景和技术水平,需要提供多种方法,并详细说明每一步操作,确保用户能够根据自己的情况选择最合适的方式。同时,要涵盖不同情况下的限制和注意事项,确保用户能够安全有效地实现屏幕常亮。</think>在Android系统中设置屏幕常亮,可通过以下多种方法实现: --- ### 一、开发者选项强制唤醒(无需root) 1. **开启开发者选项** - 进入`设置 > 关于手机`,连续点击`版本号`7次 2. **启用保持唤醒** - 进入`开发者选项`,勾选`保持唤醒(充电时不锁定屏幕)` - **限制**:仅限充电时生效,适合调试场景 --- ### 二、ADB命令全局设置(需USB调试) ```bash # 设置超时时间为最大值(24天) adb shell settings put system screen_off_timeout 2147483647 # 恢复默认(示例:30秒) adb shell settings put system screen_off_timeout 30000 ``` - **原理**:修改系统设置`screen_off_timeout`参数(单位毫秒) - **要求**:需启用`USB调试`模式 --- ### 三、应用层代码实现(开发者适用) 在Activity中添加窗口标志: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } ``` 或通过XML布局: ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:keepScreenOn="true"> <!-- 布局内容 --> </RelativeLayout> ``` --- ### 四、第三方工具方案 1. **Caffeinate**(推荐): ```bash # 安装后执行(需要Shizuku权限) adb shell shizuku activate adb shell pm enable com.suphi.caffeinate ``` 2. **Wakey**:提供定时保持唤醒功能 - 可设置`屏幕常亮时段`:09:00-18:00 - 支持`白名单应用`触发 --- ### 五、系统级修改(需root) 修改`/system/framework/framework-res.apk`中配置: ```xml <!-- 修改values/bools.xml --> <bool name="config_animateScreenLights">false</bool> <bool name="config_enableScreenAutoBrightness">false</bool> ``` - **风险提示**:可能引发系统不稳定 --- ### ⚠️ 注意事项 1. **功耗影响**:常亮状态功耗增加约`200-400mA` 2. **烧屏风险**:OLED屏幕同一画面不宜超过`2小时` 3. **推荐场景**:导航、演示、工业控制等 4. **强制恢复**: ```bash # 重置所有显示设置 adb shell settings delete system screen_off_timeout ``` 建议优先使用`FLAG_KEEP_SCREEN_ON`方案,既符合Android设计规范,又能避免全局修改带来的副作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值