如何防止 Android 设备以编程方式进入睡眠状态?
一种选择是使用 唤醒锁.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 使用。
release()
文档还包含 有用的一页,它描述了保持设备清醒的不同方法,以及您可能选择使用设备的时间。如果“阻止设备进入睡眠状态”仅指 屏幕(并且不保持 CPU 处于活动状态) ,那么唤醒锁可能比您需要的要多。
为了使用此方法,还需要确保在清单中设置了 唤醒锁定权限。
@ eldarerathis 所说的在各方面都是正确的,唤醒锁是阻止设备进入睡眠状态的正确方法。
我不知道你的应用程序需要做什么,但 真的很重要,你认为如何架构你的应用程序,这样你就不会强迫手机保持清醒,你需要更多,否则电池寿命将受到巨大影响。
我会指给你这个真正的 好榜样关于如何使用 AlarmManager触发事件,唤醒电话和(你的应用程序)执行你需要做的事情,然后再去睡觉: Alarm Manager (资料来源: commonsware.com)
AlarmManager
如果您只想防止特定 View上的睡眠模式,只需调用该 View上的 setKeepScreenOn(true)或将 keepScreenOn属性设置为 true。这将防止屏幕关闭,而 View是在屏幕上。这不需要特别许可。
View
setKeepScreenOn(true)
keepScreenOn
true
我找到了另一个可行的解决方案: 在 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" 可能是更好的选择。
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()); }