问题
I set an alarm with the flag RTC_WAKEUP to run a IntentService every 30 seconds to transmit location updates to a server. I'm planning to change the flag to RTC so it won't wake up the phone and just run when another process wake ups the phone. If I leave a LocationListener registered, will it still listen for location updates while the phone is asleep?
回答1:
Yes - working location service has it's own wake lock. However better approach is manually set proper wake lock in your broadcast receiver. Please consider some optimization - sending data over network every 30s will drain battery.
回答2:
You have multiple problems here.
I set an alarm with the flag RTC_WAKEUP to run a IntentService every 30 seconds to transmit location updates to a server.
First, you may not even get your first fix within 30 seconds, particularly if you are using GPS. You need to take into account that you may never get a fix (e.g., the user is in an underground location).
Second, please allow this figure to be user-configurable, including an option for "I'll upload the data manually please". As @piotrpo indicates, this is a significant drain on the battery. In fact, if you're using GPS, I doubt the battery will last more than a couple of hours.
Third, an IntentService
will not work well in this case, because the IntentService
will shut down before your fix arrives. At best, you'll leak memory. At worst, you won't get your fix, because Android terminates your process.
A better solution for doing background location checks is to use a regular Service
, not an IntentService
. The regular Service would register the LocationListener
in onStartCommand()
, plus arrange for a timeout notification (e.g., AlarmManager
and set()
) in case a fix is not available. When the fix arrives, run an AsyncTask
to do your upload. When the AsyncTask
completes, or if the timeout arrives and you did not get a fix, unregister the listener and call stopSelf()
to shut down the service. Along the way, you will need to maintain your own WakeLock
, to keep the device awake while all of this is going on.
For an example of most of this (minus the server upload part), see my LocationPoller.
If you are dead-set on this occurring every 30 seconds or so, you may as well not bother with AlarmManager
at all. You would have to have an everlasting service, running all the time, with a permanent WakeLock
and a permanent LocationListener
. When fixes arrive in onLocationChanged()
, upload them if they are more than 30 seconds from the previous one. And, be sure to wear a flame-retardant suit when you release the app, as those who run it may not like the results much.
来源:https://stackoverflow.com/questions/7030460/android-locationlistener-leave-on-while-phone-asleep