В чем я не уверен, так это в чеке с использованием isHeld()
- действительно ли он сообщает мне, если WakeLock
получен или нет, и нужно ли мне вообще делать эту проверку?
На самом деле немного сложно ответить. Глядя на источник для PowerManager
и PowerManager.WakeLock
здесь методы WakeLock.acquire()
и WakeLock.acquireLocked()
выглядят следующим образом ...
public void acquire(long timeout) {
synchronized (mToken) {
acquireLocked();
mHandler.postDelayed(mReleaser, timeout);
}
}
private void acquireLocked() {
if (!mRefCounted || mCount++ == 0) {
// Do this even if the wake lock is already thought to be held (mHeld == true)
// because non-reference counted wake locks are not always properly released.
// For example, the keyguard's wake lock might be forcibly released by the
// power manager without the keyguard knowing. A subsequent call to acquire
// should immediately acquire the wake lock once again despite never having
// been explicitly released by the keyguard.
mHandler.removeCallbacks(mReleaser);
try {
mService.acquireWakeLock(mToken, mFlags, mTag, mWorkSource);
} catch (RemoteException e) {
}
mHeld = true;
}
}
... mService
- это интерфейс IPowerManager
, источник которого недоступен, поэтому трудно сказать, что может или не может пойти не так при попытке вызвать acquireWakeLock(...)
.
В любом случае единственное исключение, которое может быть перехвачено, это RemoteException
, а блок catch
ничего не делает. Сразу после попытки / улова mHeld
устанавливается true
независимо.
Короче говоря, если вы позвоните isHeld()
сразу после acquire()
, результат всегда будет true
.
Дальнейшее изучение источника для PowerManager.WakeLock
показывает аналогичное поведение для release()
, который вызывает release(int flags)
, где элемент mHeld
всегда установлен на false
независимо от того, что происходит.
В заключение я хотел бы предложить, чтобы проверка isHeld()
всегда была хорошей идеей, как и в случае, если более поздние версии Android изменят это поведение методов WakeLock
.