如何让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