在来自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()一次。 - 由于被获取了两次但只释放了一次,因此引用计数锁仍然永远持有。