【发布时间】:2013-02-04 03:18:08
【问题描述】:
在来自CWAC Wakeful library 的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()。 - 由于被获取两次但仅释放一次,引用计数锁仍然永久持有。
【问题讨论】:
标签: android android-service android-lifecycle wakelock commonsware-cwac