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

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

184245 次浏览

一种选择是使用 唤醒锁.docs 中的示例:

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 处于活动状态) ,那么唤醒锁可能比您需要的要多。

为了使用此方法,还需要确保在清单中设置了 唤醒锁定权限。

@ eldarerathis 所说的在各方面都是正确的,唤醒锁是阻止设备进入睡眠状态的正确方法。

我不知道你的应用程序需要做什么,但 真的很重要,你认为如何架构你的应用程序,这样你就不会强迫手机保持清醒,你需要更多,否则电池寿命将受到巨大影响。

我会指给你这个真正的 好榜样关于如何使用 AlarmManager触发事件,唤醒电话和(你的应用程序)执行你需要做的事情,然后再去睡觉: Alarm Manager (资料来源: commonsware.com)

如果您只想防止特定 View上的睡眠模式,只需调用该 View上的 setKeepScreenOn(true)或将 keepScreenOn属性设置为 true。这将防止屏幕关闭,而 View是在屏幕上。这不需要特别许可。

我找到了另一个可行的解决方案: 在 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。

从根 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/

从布局 XML 来看,android:keepScreenOn="true" 可能是更好的选择。

更多信息: https://developer.android.com/training/scheduling/wakelock.html

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

@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);
}

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

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


this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);


LoadApplication(new App());
}