在来自CWAC Wakeful 库的WakefileIntentService.java中,代码包含:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
PowerManager.WakeLock lock = getLock(this.getApplicationContext());
if (!lock.isHeld() || (flags & START_FLAG_REDELIVERY) != 0) {
lock.acquire();
}
super.onStartCommand(intent, flags, startId);
return(START_REDELIVER_INTENT);
}
为什么要检查代码START_FLAG_REDELIVERY
- 是什么阻止了以下情况?
onStartCommand()
被调用并获得锁。- 系统在完成之前终止服务。
- 系统使用 重新传递意图,导致对已持有的锁的
START_FLAG_REDELIVERY
另一个调用。acquire()
- 服务完成并调用
release()
一次。 - 由于被获取了两次但只释放了一次,因此引用计数锁仍然永远持有。