如何防止Android设备以编程方式进入睡眠状态?


155

如何防止Android设备以编程方式进入睡眠状态?

Answers:


133

一种选择是使用唤醒锁。来自文档的示例:

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

// screen and CPU will stay awake during this section

wl.release();

此页面上还有一个表格,描述了不同类型的唤醒锁。

请注意,使用唤醒锁时需要格外小心。release()完成锁定后,请确保始终保持锁定(或不在前台)。否则,您的应用程序可能会导致严重的电池消耗和CPU使用率。

该文档还包含一个有用的页面,该页面描述了使设备保持清醒的不同方法以及何时选择使用哪种方法。如果“防止设备进入睡眠状态”仅是指屏幕(而不是保持CPU处于活动状态),则唤醒锁定可能超出您的需要。

您还需要确保在清单中设置了WAKE_LOCK权限才能使用此方法。


21
由于现在不赞成使用此方法,因此您不应再使用此方法。看一下其他答案之一。
2013年

4
仍然有一些使用唤醒锁的原因,例如设备专用于特定应用程序并且即使最小化也需要运行。
Muz

2
PowerManager.PARTIAL_WAKE_LOCK没有被弃用,我认为这是最有效的方法。它允许用户按下电源按钮,但在用户调用release()之前,CPU仍将打开。
Mansour Fahad 2014年

官方文档说:“如果需要让CPU保持运行状态以便在设备进入睡眠状态之前完成某些工作,则可以使用称为唤醒锁的PowerManager系统服务功能。”
Joaquin Iurchuk '16

这是很好的方法,但已弃用。请检查以下答案:stackoverflow.com/a/22447615/5327912
Parth Anjaria

240

如果您只想阻止特定的睡眠模式View,则只需调用setKeepScreenOn(true)View或将keepScreenOn属性设置为即可true。这样可以防止屏幕上显示时关闭View屏幕。无需特殊许可。


18
同样,这也不会迫使手机在应用程序的生命周期之外保持清醒状态。使用WakeLock可能会遇到该问题。
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

2
是的,在大多数情况下,这是更好的方法。
Edward Falk 2012年

8
这应该是选定的答案。简单,干净且符合Android的预期。谢谢。
Lior Iluz 2014年

2
“使用android:keepScreenOn =“ true”等同于使用FLAG_KEEP_SCREEN_ON。您可以使用最适合您的应用的任何一种方法。在活动中以编程方式设置标志的好处是,您可以选择在以后以编程方式清除标志,由此允许屏幕关闭” - developer.android.com/training/scheduling/wakelock.html
安东尼

请注意,setKeepScreenOn(true)只有在View可见时,才会生效。
Jeff T.

121

我找到了另一个可行的解决方案:在onCreate事件下,将以下行添加到您的应用中。

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

我的示例Cordova项目如下所示:

package com.apps.demo;
import android.os.Bundle;
import android.view.WindowManager;
import org.apache.cordova.*;

public class ScanManActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        super.loadUrl("http://stackoverflow.com");
    }
}

在那之后,我的应用程序在打开时不会进入睡眠状态。感谢您对xSus的答复。


我认为这是最好的选择... +1
阿米特(Amit)2012年

这与Witek的答案相同,唯一的区别是您将其放在“ .java”文件中,而不是“ .xml”文件中;-)
tiktak 2013年

许可怎么样?需要许可吗?
Mehdi Khademloo 2015年

@Mehdi Khademloo不需要许可。
Wessam El Mahdy


17

在活动窗口上设置标志,如下所示

@Override public void onResume() {
 super.onResume();
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@Override public void onPause() {
 super.onPause();
 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

6

在根shell(例如adb shell)中,您可以使用以下命令进行锁定:

echo mylockname >/sys/power/wake_lock    

之后,设备将保持苏醒状态,直到您执行以下操作:

echo mylockname >/sys/power/wake_unlock    

与“ mylockname”相同的字符串。

请注意,这不会阻止屏幕变黑,但会阻止CPU休眠。

请注意,/ sys / power / wake_lock是用户无线电(1001)和组系统(1000)以及(当然)是root的读写文件。

参考在这里:http : //lwn.net/Articles/479841/


3

@eldarerathis所说的所有方面都是正确的,唤醒锁是使设备保持睡眠状态的正确方法。

我不知道您的应用程序需要做什么,但真正重要的是考虑一下如何设计应用程序,以免强迫手机保持清醒状态,以免消耗更多电量,否则电池寿命将遭受巨大损失。

我将向您指出这个非常好的示例,该示例说明如何使用AlarmManager事件触发事件,唤醒电话以及(您的应用)执行您需要执行的操作,然后再次进入睡眠状态:警报管理器(来源:commonsware.com)


有一些实用的应用程序专门用于消耗电池电量。我只需要一次。基本上,它将获取唤醒锁,疯狂振动,打开手电筒,增加亮度等。所以,是的,有一些应用程序可以利用此功能。但这不是话题,请原谅我
TheRealChx101 '19

0

如果您是Xamarin用户,这是解决方案:

   protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle); //always call superclass first

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.