Android关闭屏幕的同时禁止硬件进入休眠
Screen Off之后,CPU和各种外设(包括WIFI,蓝牙,加速度传感器等等)都停止工作。
如果申请了PARTIAL_WAKE_LOCK,那么即使按Power键,系统也不会进Sleep,如Music播放时。如果申请了其它的WakeLock,
在某些手机上,当屏幕关闭时,手机虽然还是在通过UDP发送数据,但是数据固定不变了,这说明传感器已经停
止更新数据。原因:由于Android的开放性,任何手机生产商都可以对系统裁剪、自定义。尤其是Android的驱动
程序,谷歌只定义了头文件,规定必须实现的函数,而具体实现完全有厂商决定。有些手机被设计成这样:当电
源键被按下时,驱动程序关闭传感器电源。因此,即使加了WAKELOCK也没用。毕竟,谷歌规定WAKELOCK只是“保
持CPU”运转,并没有规定WakeLock需要保持传感器等外设运转。
一种对部分手机有效的办法,即注册一个Intent.ACTION_SCREEN_OFF消息的事件监听器,并在
Intent.ACTION_SCREEN_OFF监听器中重新注册传感器事件监听器。于是,当屏幕关闭时,程序就会再次注册传感
器事件监听器。
流程:
(1)当屏幕关闭之时,安卓停掉所有传感器的电源;
(2)然后执行Intent.ACTION_SCREEN_OFF的回调函数;
(3)在回调函数中,重新注册传感器监听器。而传感器监听器的注册导致传感器电源又重新开启。
Screen Off之后,CPU和各种外设(包括WIFI,蓝牙,加速度传感器等等)都停止工作。
WakeLock能够禁止Android硬件进入休眠。进程可以创建各种类型的WakeLock,只要系统中还存在WakeLock,那么系统就不会休眠。
以下是创建并使能Wake Lock的一般性代码:
PowerManager powerManager=(PowerManager)getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock=powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,TAG);
wakeLock.acquire();
释放Wake Lock的代码为:
wakeLock.release();
而创建Wake Lock的代码:
WakeLock wakeLock=powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,TAG);
中,PARTIAL_WAKE_LOCK可以替换成其他的参数,以决定Wake Lock的类型。
值 | 意义 |
PARTIAL_WAKE_LOCK | 保持CPU运转,屏幕和键盘灯有可能是关闭的。 |
SCREEN_DIM_WAKE_LOCK | 保持CPU运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯。 |
SCREEN_BRIGHT_WAKE_LOCK | 保持CPU运转,保持屏幕高亮显示,允许关闭键盘灯。 |
FULL_WAKE_LOCK | 保持CPU运转,保持屏幕高亮显示,键盘灯也保持亮度。 |
ACQUIRE_CAUSES_WAKEUP | 不会唤醒设备,强制屏幕马上高亮显示,键盘灯开启。有一个例外,如果有notification弹出的话,会唤醒设备。 |
ON_AFTER_RELEASE | Wake Lock被释放后,维持屏幕亮度一小段时间,减少Wake Lock循环时的闪烁情况。 |
按Power键,系统还是会进Sleep。但如果不领会Android设计者的意图而滥用Wake Lock API,为了自身程序在后台的正常工作而
长时间阻止AP进入休眠状态,就会成为待机电池杀手。
当然,要在AndroidManifest.xml中加权限:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
在某些手机上,当屏幕关闭时,手机虽然还是在通过UDP发送数据,但是数据固定不变了,这说明传感器已经停
止更新数据。原因:由于Android的开放性,任何手机生产商都可以对系统裁剪、自定义。尤其是Android的驱动
程序,谷歌只定义了头文件,规定必须实现的函数,而具体实现完全有厂商决定。有些手机被设计成这样:当电
源键被按下时,驱动程序关闭传感器电源。因此,即使加了WAKELOCK也没用。毕竟,谷歌规定WAKELOCK只是“保
持CPU”运转,并没有规定WakeLock需要保持传感器等外设运转。
一种对部分手机有效的办法,即注册一个Intent.ACTION_SCREEN_OFF消息的事件监听器,并在
Intent.ACTION_SCREEN_OFF监听器中重新注册传感器事件监听器。于是,当屏幕关闭时,程序就会再次注册传感
器事件监听器。
流程:
(1)当屏幕关闭之时,安卓停掉所有传感器的电源;
(2)然后执行Intent.ACTION_SCREEN_OFF的回调函数;
(3)在回调函数中,重新注册传感器监听器。而传感器监听器的注册导致传感器电源又重新开启。
所以综上,正确的做法是注册一个锁屏的广播接收者,当锁屏事件发生时,wakeup cpu and register sensorListener