如何使Android WakeLock正常工作?
我的WakeLock不能使我的设备保持唤醒状态。
在mWakeLock中,我得到了:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag");
mWakeLock.acquire();
然后:
new CountDownTimer(1320000, 200) {
public void onTick(long millisUntilFinished) {
// I update a progress bar here.
}
public void onFinish() {
// I finish updating the progress bar.
mWakeLock.release();
}
}.start();
计时器结束前屏幕关闭,如何使屏幕保持可见?
mWakeLock是先前这样声明的字段:
private PowerManager.WakeLock mWakeLock;
我的设备使用Android 1.6。 我非常感谢您为解决此问题提供的帮助。
Curyous asked 2020-06-21T09:49:47Z
13个解决方案
106 votes
WakeLock通常不会导致重新启动问题。 您的编码中可能还有其他问题。WakeLock会消耗大量电池,如果使用后没有释放电池。
WakeLock是使屏幕保持打开状态的一种低效方式。 而是使用WindowManager来做魔术。 下面的一行足以满足WakeLock的要求。WakeLock权限也需要此项才能起作用。同样,此代码比wakeLock更有效。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
您无需手动释放WakeLock。 此代码将允许Android系统自动处理锁定。 当您的应用程序位于前景中时,将保持WakeLock,否则android系统会自动释放Lock。
试试这个,发表您的评论...
Anoop CH answered 2020-06-21T09:50:19Z
50 votes
您的清单中是否设置了所需的权限?
wf. answered 2020-06-21T09:50:38Z
23 votes
您只需要编写以下代码:
private PowerManager.WakeLock wl;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen");
}//End of onCreate
@Override
protected void onPause() {
super.onPause();
wl.release();
}//End of onPause
@Override
protected void onResume() {
super.onResume();
wl.acquire();
}//End of onResume
然后在清单文件中添加权限
现在,您的活动将始终保持清醒状态。您可以根据需要执行其他操作,例如w1.release()。
Maverick answered 2020-06-21T09:51:08Z
7 votes
如下所示,在onFinish()中添加权限
最好在您的onFinish()声明标签之前,但在标签之后,之后,尝试使您的onCreate()方法仅包含WakeLock实例化。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag");
}
然后在您的onFinish()方法位置
@Override
public void onResume() {
mWakeLock.aquire();
}
并在您的onFinish()方法中
@Override
public void onFinish() {
mWakeLock.release();
}
CharlieNorris answered 2020-06-21T09:51:41Z
6 votes
要实现相同的程序设计,您可以使用以下代码
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
或在布局中添加以下内容也将执行上述任务
android:keepScreenOn="true"
您可以从以下网址获得详细信息[http://developer.android.com/training/scheduling/wakelock.html]
当键盘锁锁定时,我已使用以下组合唤醒我的屏幕并保持屏幕开启
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
Sunil Kumar Sahoo answered 2020-06-21T09:52:14Z
6 votes
保持萤幕开启
第一种方式:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
第二种方式:
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
...
保持CPU处于打开状态:
和
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();
要释放唤醒锁,请致电wakelock.release()。这会将您的主张释放给CPU。 请务必在应用程序使用完后立即释放唤醒锁,以免耗尽电池。
文档在这里。
Beyaz answered 2020-06-21T09:53:00Z
2 votes
我有个类似的问题。 我可以让屏幕保持打开状态,但是如果我使用了部分唤醒锁并且关闭了屏幕,则在打开屏幕之前不会调用我的onFinish函数。
首先,您可以使用mWakeLock.isHeld()检查唤醒锁,以确保获得它。 最简单的方法是将其添加到代码中,在调试器中为其设置断点,然后进行检查。
就我而言,我明白了,但是部分唤醒锁似乎没有做任何事情。 这是我的屏幕暗锁的工作代码。
protected void setScreenLock(boolean on){
if(mWakeLock == null){
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK |
PowerManager.ON_AFTER_RELEASE, TAG);
}
if(on){
mWakeLock.acquire();
}else{
if(mWakeLock.isHeld()){
mWakeLock.release();
}
mWakeLock = null;
}
}
附录:
Droid Eris和DROID用户向我报告说,尽管它在我的G1上正常运行,但在他们的设备上不起作用。 您在什么设备上测试? 我认为这可能是Android错误。
Brock Tice answered 2020-06-21T09:53:38Z
2 votes
感谢您的关注。我一直在花5分钟的时间在代码中实现Timer来进行一项活动,这一直很困难,因为我的手机已设置为2分钟左右关闭屏幕/处于睡眠状态。 有了以上信息,看来我已经可以解决此问题。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Time Lockout after 5 mins */
getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
Intent i = new Intent(AccountsList.this, AppEntryActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();
return;
}
}, 300000);
/* Time Lockout END */
}
Steven Bennett answered 2020-06-21T09:53:59Z
2 votes
android开发人员网站的示例代码段
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
后台作业的最佳做法
Sree Rama answered 2020-06-21T09:54:23Z
2 votes
{PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakeLock");
wakeLock.acquire();}
使用此代码,别忘了在Android清单中允许唤醒锁
Tugadar answered 2020-06-21T09:54:43Z
1 votes
在准备释放它之前,请确保没有意外清理newWakeLock。 如果完成,则释放锁。 例如,如果将其设置为null并随后运行垃圾收集器,则会发生这种情况。 如果不小心设置了同名的局部变量而不是方法级变量,也可能发生这种情况。
我还建议检查LogCat以查找具有PowerManagerService标记或您传递给newWakeLock的标记的条目。
Emdot answered 2020-06-21T09:55:08Z
1 votes
创建唤醒锁时,请尝试使用ACQUIRE_CAUSES_WAKEUP标志。ON_AFTER_RELEASE标志只是重置活动计时器,以使屏幕保持更长的时间。
[HTTP://developer.Android.com/reference/Android/OS/power manager.HTML#acquire_causes_wakeup]
Archit answered 2020-06-21T09:55:33Z
0 votes
在AndroidManifest.xml中添加权限:
然后在my.xml中添加代码:
android:keepScreenOn="true"
在这种情况下将永远不会关闭页面!你可以阅读更多
Mortreza AD answered 2020-06-21T09:56:02Z