Android 6.0设备中‘enable true hibernation’功能的编程设置与状态检测咨询
我完全懂你的处境——Android 6.0设备没有物理按键,本来想靠设备休眠时重启来优化电池消耗,结果碰到这个“enable true hibernation”功能搞事情:它会让设备到了休眠时间不进入真正的休眠状态,只是把屏幕亮度拉到0,直接打乱了你原本的电池优化计划,所以你得先能通过代码检测这个功能的开启状态对吧?
给你几个实际可行的思路,你可以根据设备的实际情况调整:
直接读取系统设置的对应参数
这个“enable true hibernation”大概率是设备厂商定制的系统隐藏功能,这类功能通常会在Settings.Global或者Settings.System里对应一个开关参数,比如可能叫true_hibernation_enabled或者enable_true_hibernation。
你可以用这段代码尝试读取状态:// 记得在Manifest里添加权限:<uses-permission android:name="android.permission.READ_SETTINGS" /> import android.provider.Settings; import android.content.ContentResolver; // 读取功能状态,默认返回0代表关闭 boolean isTrueHibernationEnabled = Settings.Global.getInt(getContentResolver(), "true_hibernation_enabled", 0) == 1;要是这个键名不对,你可以先通过adb命令排查:连接设备后在电脑终端执行
adb shell settings get global true_hibernation_enabled,或者替换成enable_true_hibernation等类似键名,找到对应的参数名称。通过屏幕状态与亮度的异常组合判断
开启这个功能后,设备触发“休眠”时不会进入深度休眠,只是把亮度设为0,所以可以通过监听休眠广播+检测当前设备状态来判断:- 注册
ACTION_SCREEN_OFF广播接收器,收到广播后执行:import android.os.PowerManager; import android.content.Context; PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); // 检查设备是否还处于交互状态(没进入深度休眠) boolean isDeviceInteractive = powerManager.isInteractive(); // 读取当前屏幕亮度值 int currentBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, -1); - 如果此时
isDeviceInteractive为true,但currentBrightness为0,基本就能判定这个“enable true hibernation”功能是开启状态了。
- 注册
权限相关的注意事项
- 读取系统设置需要申请
READ_SETTINGS权限,要是需要修改这个功能的状态,还得申请WRITE_SETTINGS权限; - Android 6.0及以上版本,
WRITE_SETTINGS是特殊权限,不能仅通过Manifest申请,需要引导用户手动授权:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.System.canWrite(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, 1001); } }
- 读取系统设置需要申请
最后要提醒你,因为这个功能是厂商定制的,不同品牌设备的实现可能有差异,如果上面的通用方法不管用,最好联系设备厂商获取他们的定制设置参数或者相关API说明,这样能更准确地检测功能状态。
内容来源于stack exchange

