如何让Android WakeLock工作?

我的WakeLock没有让我的设备保持清醒。

OnCreate()我有:

 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(); 

定时器结束之前屏幕closures,如何使屏幕保持可见?

mWakeLock是之前声明的字段:

 private PowerManager.WakeLock mWakeLock; 

我的设备使用Android 1.6。 我真的很感激任何帮助来解决这个问题。

WakeLock通常不会导致重新启动问题。 编码中可能还有其他一些问题。 如果使用后没有释放的话,WakeLock会大量使用电池。

WakeLock是保持屏幕无效的一种方式。 而是使用WindowManager来实现魔法。 下面的一行就足够了WakeLock。 WakeLock权限也需要这个工作。 而且这个代码比wakeLock更有效率。

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

您不需要手动唤醒WakeLock。 此代码将允许Android系统自动处理locking。 当你的应用程序在前台时,WakeLock被保持,否则android系统自动释放锁。

试试这个并发表你的评论…

您的清单中是否有必要的权限 ?

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

你只需要写这个:

  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 

然后在清单文件中添加权限

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

现在你的活动将永远保持清醒。 你可以按照你的要求做其他的事情,比如w1.release()

要实现相同的编程,您可以使用以下内容

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

或者在布局中添加以下内容也将执行上述任务

  android:keepScreenOn="true" 

您可以从以下url获得详细信息http://developer.android.com/training/scheduling/wakelock.html

当键盘locking并保持我的屏幕时,我已经使用以下的组合来唤醒我的屏幕

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

AndroidManifest.xml添加权限,如下所示

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

最好在你的<application>声明标签之前,但在<manifest>标签之后,试着让你的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"); } 

然后在你的onResume()方法的地方

 @Override public void onResume() { mWakeLock.aquire(); } 

和你的onFinish()方法的地方

 @Override public void onFinish() { mWakeLock.release(); } 

我有类似的问题。 我可以让屏幕保持打开状态,但是如果我使用部分唤醒锁并closures屏幕,则只有打开屏幕后才能调用onFinishfunction。

首先,您可以使用mWakeLock.isHeld()来检查您的唤醒locking,以确保获得它。 最简单的方法是将代码添加到代码中,在debugging器中设置一个断点,然后检查它。

在我的情况,我得到它,但部分唤醒锁似乎没有做任何事情。 这是我的屏幕昏暗的锁的工作代码。

 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上工作正常。 你在testing什么设备? 我认为这可能是一个Android的错误。

感谢您的这个线程。 我一直在我的代码中执行一个计时器很难5分钟来运行一个活动,因为我的手机已经设置屏幕/睡眠大约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 */ } 

来自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); } 

后台工作的最佳实践

确保mWakeLock在您准备释放之前不会意外清理干净。 如果最终确定,locking被释放。 例如,如果将其设置为null并且垃圾收集器随后运行,则可能发生这种情况。 如果不小心设置了一个名称相同的局部variables而不是方法级variables,也会发生这种情况。

我还build议检查LogCat中有PowerManagerService标记的条目或传递给newWakeLock的标记。

 {PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE); WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakeLock"); wakeLock.acquire();} 

使用此代码,不要忘记在Android清单中允许wakelock

保持屏幕打开

第一种方法:

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

第二种方式:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"> ... </RelativeLayout> 

保持CPU处于开启状态:

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

 PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag"); wakeLock.acquire(); 

要释放唤醒锁,请调用wakelock.release() 。 这释放您的要求到CPU。 一旦应用程序完成使用,释放唤醒locking非常重要,以避免电池电量耗尽。

文档在这里 。

尝试在创build唤醒锁时使用ACQUIRE_CAUSES_WAKEUP标志。 ON_AFTER_RELEASE标志只是重置活动计时器,以保持屏幕稍长。

http://developer.android.com/reference/android/os/PowerManager.html#ACQUIRE_CAUSES_WAKEUP