Android 接受广播唤醒屏幕

时间:2022-05-16 14:34:31

方法:

PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
/* PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。
SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯
FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
ACQUIRE_CAUSES_WAKEUP:强制使屏幕亮起,这种锁主要针对一些必须通知用户的操作.
ON_AFTER_RELEASE:当锁被释放时,保持屏幕亮起一段时间*/

PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE , "wjc");
wakeLock.acquire();
//wakeLock.acquire(1000);
wakeLock.release();

app层通过得到wakelock调用acquire 唤醒。

实际中遇到的问题

刚开始设置

wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "wjc");

发现就是无法电量屏幕,后来研究源码发现:需要|PowerManager.ACQUIRE_CAUSES_WAKEUP
在PowerManagerService.java中:

    private void applyWakeLockFlagsOnAcquireLocked(WakeLock wakeLock, int uid) {
//表明必须要PowerManager.ACQUIRE_CAUSES_WAKEUP才能通过acquire 电量屏幕
if ((wakeLock.mFlags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0
&& isScreenLock(wakeLock)) {
String opPackageName;
int opUid;
if (wakeLock.mWorkSource != null && wakeLock.mWorkSource.getName(0) != null) {
opPackageName = wakeLock.mWorkSource.getName(0);
opUid = wakeLock.mWorkSource.get(0);
} else {
opPackageName = wakeLock.mPackageName;
opUid = wakeLock.mWorkSource != null ? wakeLock.mWorkSource.get(0)
: wakeLock.mOwnerUid;
}
wakeUpNoUpdateLocked(SystemClock.uptimeMillis(), wakeLock.mTag, opUid,
opPackageName, opUid);
}
}

耗流问题

在实际工作中,发现添加google 服务的一些版本,会产生很大的耗流。
后来发现是由于此服务存在wakelock acquire后没有被release造成的。
android系统在检测到任何应用存在acquire 没有被release后,系统就不会进入休眠状态。