在我的活动期间保持屏幕亮着

70

我的应用中有三个活动。我想在第二个活动中保持屏幕常亮。除非手动按下“锁定”键,否则屏幕不应在我的第二个活动中关闭。我查看了许多链接,但它们对我来说似乎不清楚。


在这里查看详细答案... https://dev59.com/72025IYBdhLWcg3w76hq#24261889 - Zar E Ahmer
5个回答

170

如在Android教程保持屏幕唤醒中所述,你可以通过几种方式实现此功能。你可以在活动窗口上设置FLAG_KEEP_SCREEN_ON:

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

在Android中,为了保持屏幕常亮,可以在Activity的布局文件的根视图中添加属性android:keepScreenOn="true"。通过以编程方式设置标志的优点是您可以使用

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

当您不再需要在应用程序运行时强制屏幕保持唤醒状态时。

另一种控制屏幕(以及其他特定资源)的方法是使用唤醒锁:

mWakeLock = ((PowerManager) getContext().getSystemService(Context.POWER_SERVICE))
    .newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass().getName());
mWakeLock.acquire();
// screen stays on in this section
mWakeLock.release();

清单文件中必须包含以下权限:

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

然而,正如教程中所讨论的那样,唤醒锁(wake lock)更适合于其他用例(例如需要在屏幕关闭时仍需保持CPU运行的服务或后台任务)。


7
第一个选择更好得多......不要使用唤醒锁定!它需要在清单中附加的额外权限!https://dev59.com/X3I95IYBdhLWcg3w1Bro#2134602 - Alex Lockwood
11
对于OP的应用程序,第一种方法更好。但是采用“不使用唤醒锁”的策略是错误的。唤醒锁可以更好地控制屏幕开启状态。当活动仅需要在短时间内保持屏幕开启时,可以释放唤醒锁以节省电池寿命。使用第一种方法时,屏幕将在整个活动前台中保持开启状态。此外,执行代表活动工作的服务无法使用第一种方法。 - Ted Hopp
是的,抱歉...有些情况下使用唤醒锁是正确的。但如果你只是想在活动生命周期内保持屏幕常亮,第一选择更好。 - Alex Lockwood
只需在您的活动的根布局中添加android:keepScreenOn="true"即可,不要使用唤醒锁。请参见此处:https://dev59.com/X3I95IYBdhLWcg3w1Bro#2134602 - Zar E Ahmer
1
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 应该放在 setContentView() 之前吗? - Yar
1
@Yar - 这并不重要。虽然确实有些标志必须在设置内容视图之前设置,但 FLAG_KEEP_SCREEN_ON 不是其中之一。即使是 Google 关于保持屏幕常亮的指南 也显示要在调用 setContentView() 后设置此标志,并指出您可以在活动生命周期内随时设置和清除它。 - Ted Hopp

57

我觉得这个解决方案更容易:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" // Whatever your layout is
    ...
    android:keepScreenOn="true"> // Add this line

只需将此添加到您的活动布局XML中。


5
很好,干净清爽。 - OneWorld
1
这更加干净。 - WISHY

6
根据我理解你的问题,我认为你需要在你的应用程序中使用WAKE_LOCK。类似于以下内容:
final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"");    
mWakeLock.acquire();

在您的应用程序的manifest.xml文件中添加以下内容:

并在文件中添加此内容,

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

2
请勿使用唤醒锁。 - Aashish Kumar

1

尝试使用这个

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

你能否再解释一下你的解决方案是如何解决这个问题的?这将有助于原帖作者更好地理解你的解决方案。 - KLee1

0

这段代码已过时,请使用以下代码替代:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();

使用完毕后,调用以下方法(最佳解决方案是在某个活动的onDestroy方法中调用此方法):

wl.release();

关于此事更多信息,请查看此link


3
在API水平17中,PowerManager.SCREEN_DIM_WAKE_LOCK被弃用,推荐使用WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - anon

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