如何在Activity执行期间防止Android设备屏幕关闭?

46

我有一个Activity,通常需要一些时间来观看屏幕而不与其进行交互。

问题在于,屏幕会像几乎所有其他应用程序一样关闭。

我希望防止我的Activity自动关闭屏幕,就像Dolphin HD那样(如果您从设置菜单中进行配置)。

我想让用户按下常规锁定按钮关闭屏幕,但在我的Activity中防止设备自动锁定。

我该如何实现这一点?

谢谢。


你正在寻找的东西是一个wakelock - user658042
1
@alextsc:实际上,对于用户界面,有一个更好的答案。 - CommonsWare
6个回答

105
在您的布局XML资源中,向某个小部件添加 android:keepScreenOn="true" ,只要该小部件在屏幕上可见,屏幕就不会自动关闭。
编辑:其他答案建议使用WakeLock,从技术上讲它确实有效。但是,您必须手动释放WakeLock(如果出错,屏幕将长时间保持亮着)。并且,由于您可能会出错,所以需要WAKE_LOCK权限。使用keepScreenOn可以避免所有这些问题。

谢谢你的回答,这个方法非常有效 :) 我认为wakelock可能是一个好的方式,但这个方法更简单。 - Alex
1
我试图将此属性添加到一个视图中,该视图位于最初为GONE的片段内,并通过应用程序中的代码设置为VISIBLE。但这并没有起作用:屏幕仍然关闭。"noelicus"的答案效果很好。 - treesAreEverywhere
2
如果您更改具有“keepScreenOn”属性的视图的可见性,则无法正常工作。例如,如果您最初隐藏带有该属性的视图并稍后显示它,则屏幕仍将关闭。在这些情况下,请按照“noelicus”的答案中所述使用WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON。 - treesAreEverywhere
我在一个托管在DialogFragment中的Fragment中设置了keepScreenOn=true,最初它按预期工作。然而,当进行屏幕旋转的配置更改时,显示屏没有保持开启状态。 - AdamHurwitz
@CommonsWare 哇,谢谢。是我犯了错,有些混淆了当前的项目。我会删除之前的评论以免混淆其他人。 - Volodymyr Buberenko
显示剩余3条评论

40

要即时更改它,请执行以下操作:

if (keepScreenOn)
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
else
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

4

处理Fragment和屏幕旋转

Android文档中保持设备唤醒列出了每个解决方案。

Solution #1 - 标志

文档 - 使用唤醒锁的替代方法

对于Fragment,请使用程序化方法,这样消耗的电池更少。

启用

activity!!.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

禁用

activity!!.window.clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON)

对于我的用例,我在onStop()中调用它,这样当退出显示媒体内容的Fragment时,屏幕会默认返回正常配置。

避免

keepScreenOn=true在存在诸如Fragment的屏幕旋转等配置更改时无效。

注意:Android的保持设备唤醒文档应相应更新以处理此情况。

Solution #2 - 唤醒锁

文档 - 使用唤醒锁保持CPU运行

唤醒锁可以更好地控制设备的特定元素保持唤醒,但它会消耗更多电池,并且由于系统不会自动处理,因此重要的是手动释放它以节省电池。


2

对于 "Xamarin Android":

Window.AddFlags(WindowManagerFlags.KeepScreenOn);

1

谢谢回答,那个非常有用。 - Alex

1

感谢您的回答和提供文档链接,这样就能了解如何做这种事情,但是这一次我想选择@CommonsWare的解决方案:P - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接