WakefulIntentService Updated, Welcomes Its New Donut Overlord
Complaints occasionally rolled in for WakefulIntentService,
stemming from random WakeLock issues being reported in
the field.
For those of you who have no idea what I am talking about,
WakefulIntentService is an IntentService implementation
that manages a WakeLock. Used properly, it ensures that your
periodic AlarmManager work will run to completion without
the device falling back asleep, if you are using a _WAKEUP-style
alarm. This is key for many polling services.
Near as I am able to tell, the problem stemmed
from my use of onStart() in the service. If the service
were to crash, Android would restart it, but without re-delivering
an Intent. As a result, the WakeLock would never be
acquired, and so it would generate an under-locked exception
when the work was eventually completed.
To combat this, I am discontinuing support for Android 1.6
and older. v0.4.0 of the service now requires API level 5 or
higher, and uses onStartCommand(). I am trying START_REDELIVER_INTENT
semantics now, as that should be enough to prevent these errors.
If that proves to be insufficient, I may fall back to START_NOT_STICKY,
basically abandoning the current batch of work and waiting
for the next alarm or whatever.
As always, if you have questions or concerns about this
component, please join the
cw-android Google Group
and post there!

