WakeLock

作者: 众少成多积小致巨 | 来源:发表于2019-06-29 18:32 被阅读0次

概述

wakelock是一种锁的机制,只要有应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态。比如,手机屏幕在屏幕关闭的时候,有些应用依然可以唤醒屏幕提示用户消息,这里就是用到了wakelock锁机制,虽然手机屏幕关闭了,但是这些应用依然在运行着。手机耗电的问题,大部分是开发人员没有正确使用这个锁,成为"待机杀手"。

Android手机有两个处理器,一个叫Application Processor(AP),一个叫Baseband Processor(BP)。AP是ARM架构的处理器,用于运行Linux+Android系统;BP用于运行实时操作系统(RTOS),通讯协议栈运行于BP的RTOS之上。非通话时间,BP的能耗基本上在5mA左右,而AP只要处于非休眠状态,能耗至少在50mA以上,执行图形运算时会更高。另外LCD工作时功耗在100mA左右,WIFI也在100mA左右。一般手机待机时,AP、LCD、WIFI均进入休眠状态,这时Android中应用程序的代码也会停止执行。

Android为了确保应用程序中关键代码的正确执行,提供了Wake Lock的API,使得应用程序有权限通过代码阻止AP进入休眠状态。但如果不领会Android设计者的意图而滥用Wake Lock API,为了自身程

序在后台的正常工作而长时间阻止AP进入休眠状态,就会成为待机电池杀手。

使用

1、保持屏幕常亮

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

或者在xml中布局跟节点中:android:keepScreenOn="true"

2、WekeLock获取

添加使用权限:<uses-permission android:name="android.permission.WAKE_LOCK" />

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

代码

PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);

PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myapp:mytag");

PowerManager.PARTIAL_WAKE_LOCK标志: cpu运行,屏幕不亮,键盘不亮

wakeLock.acquire();获取锁,按照设置标志位保持

wakeLock.release();释放锁

3、优缺点

WakeLock唤醒会导致耗电量增加,因此需要慎用;最好使用AlarmManager或者JobScheduler代替

WakeLock一般和广播,IntentServie一起使用;广播负责接收到需要运行,获取锁后,通知service处理

相关文章

网友评论

    本文标题:WakeLock

    本文链接:https://www.haomeiwen.com/subject/sxapcctx.html