我假设您只希望当您的应用程序位于前台时它才有效。
这段代码:
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);
不会传统意义上关闭屏幕。它使屏幕尽可能暗。在标准平台中,其亮度是有限制的;如果您的设备实际上允许屏幕完全关闭,那么这是该设备实现的一些特殊性,而不是您可以依赖的跨设备行为。
事实上,将其与 FLAG_KEEP_SCREEN_ON 结合使用意味着您永远不会允许屏幕关闭(从而设备进入低功耗模式),即使特定设备允许您将屏幕亮度设置为完全关闭。请牢记这一点。与屏幕真正关闭时相比,您将使用更多的电量。
现在,要将屏幕恢复为常规亮度,只需设置亮度值即可:
WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = -1;
getWindow().setAttributes(params);
我无法解释为什么这不会替换您之前设置的 0 值。作为测试,您可以尝试在其中强制设置全亮度以强制达到该特定亮度:
WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 1;
getWindow().setAttributes(params);
这绝对有效。例如,Google 的图书应用程序使用此功能,允许您在使用图书时将屏幕亮度设置为变暗,然后在关闭时返回到常规亮度。
为了帮助调试,您可以使用“adb shell dumpsys window”来查看窗口的当前状态。在窗口的数据中,它将告诉您为其设置的当前 LayoutParams。确保您认为的价值确实存在。
再次强调,FLAG_KEEP_SCREEN_ON 是一个单独的概念;它和亮度相互没有直接影响。 (如果您在将亮度设置为 0 时已经设置了该标志,那么在撤消亮度时就没有理由再次设置该标志。该标志将保持设置状态,直到您更改它。)