最近在做一个关闭屏幕60分钟后自动下载的需求,整个模块已经竣工,测试发现在充电状态下没有任何问题可以直接下载,但是在非充电状态下自动下载失效了,这时首先要观察日志看看到底是什么情况,小插曲平时都是usb debug看日志,现在的状态是不插usb自然无法通过这个来看日志,还好android就是nb提供wifi连接adb命令来查看日志,前提是手机和pc必须在同一个局域网,具体命令如下:
1、setprop service.adb.tcp.port 5555
2、adb connect 192.168.253.2
3、adb logcat -s AbstractProcessor
言归正传,发现日志没有打印在关闭屏幕状态下,经google发现android系统在手机无操作的情况下,为了省电,一般会变暗,关闭屏幕。而系统的电源管理,主要由PowerManager 和PowerManager.WakerLock类进行控制。所以要想关闭屏幕下保证cpu是work的就要用到wakerlock
PowerManager和WakeLock的使用:
private void acquireWakeLock()
{ if (wakeLock
== null )
{ Logger.d( "Acquiring
wake lock" ); PowerManager
pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock
= pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, this .getClass().getCanonicalName()); wakeLock.acquire(); } } private void releaseWakeLock()
{ if (wakeLock
!= null &&
wakeLock.isHeld()) { wakeLock.release(); wakeLock
= null ; } } |
acquireWakeLock()方法中获取了 SCREEN_DIM_WAKE_LOCK锁,该锁使CPU保持运转,屏幕保持亮度(可以变灰)。releaseWakeLock()方法则是释放该锁。
所以最终的解决方案是在监听关闭屏幕广播处acquireWakeLock(),打开屏幕处releaseWakeLock() ,必须成对使用。