解决手机关闭屏幕线程挂起问题

原创 2015年11月19日 17:16:42


最近在做一个关闭屏幕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() ,必须成对使用。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android adb 点亮 关闭 屏幕 命令

Android adb 点亮和关闭屏幕的命令# kernel休眠 echo mem > /sys/power/state # kernel唤醒 echo on > /sys/power/state

Android adb命令唤醒屏幕

adb shell input keyevent 26

Android亮屏和熄屏控制

一.  前言 我们的Android应用程序很多需要和亮屏和熄屏打交道,比如闹钟的时候,需要保持亮屏,之后又需要熄屏。那么今天,我们来分析下这方面的功能。 二.  系统服务 --- PowerM...

Android : 线程的结束,挂起和恢复(上)

在Android应用的开发过程中, 我们有时候需要通过创建一个新的线程去完成一些任务。例如,我们去进行搜寻动作,如果搜寻比较费时,我们就需要通过进度条来提示用户搜寻的进展情况,避免用户认为发生了死机。...

FTP读取远程文件&解决使用FTPClient类时线程挂起的问题

java FTP 下载读取文件
  • kunfd
  • kunfd
  • 2017-08-09 14:58
  • 185

程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案

工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题:当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭,...

多UI线程WPF程序随机挂起问题

多UI线程WPF程序随机挂起问题问题描述一个使用C#开发的程序,在某台Windows10,总是随机挂起,1天总有3、4次。主界面突然就挂起在任务栏里,无法使用,只有杀掉重新启动。后来发现问题是使用了U...

线程的打开,闭合,挂起

  • 2015-07-03 17:45
  • 237KB
  • 下载

C# 线程的挂起与唤醒 (AutoResetEvent,ManualResetEvent)

如果说C#和C++有什么不同,博主不得不说,对于异步的支持程度是C#的一一个伟大的进步。     其实早期的C++都没有异步,并发的概念。博主第一次使用C++创建异步程序的时候,是使用boost库的内...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)