I’m having trouble understanding the screen timeout function and how that will effect code running in my activities. Does onPause() get called when the screen times out?
I have an activity and a related service running an AsyncTask, which is counting down from 60 seconds. I want to be able to lock the screen, and at the end of the timer, start a new service and new activity that sounds an alarm and vibrates the handset. When the user wakes the phone they should see the new activity, whose display is being updated via a broadcast receiver from the new service.
What I am finding is that the behaviour is highly unpredictable. Once the screen times out, it will usually sound the alarm and bring up the new activity under the lockscreen, but this takes anywhere between 2-4 minutes, and sometimes doesn’t happen at all. I seem the get better results locking the screen manually, rather than waiting for a time-out, but it’s still unpredictable and varies per handset.
If anyone had any thoughts/suggestions as to whats going on under the hood, and even whether this approach is sensible, the would be much appreciated.
Regards
Ok, so I’ve found the answer, I think my question was a little convoluted to begin with, so I’ll try to answer the various parts, as well as adding my actual solution….
I had an
Activitythat was starting aService. TheService(which included anAsyncTask) was supposed to run in the background, monitoring the accelerometer and counting down a timer. TheServicewas then periodically sending a broadcastIntentto theActivity, when the broadcast contained certain data, theActivityneeded to run some code. This all needed to happen with the screen off.My findings are that, yes, when hitting the screen lock, the
Activitydoes runonPause(), but is still fully able to execute code in the internalBroadcastRecieverclass, and consequently this can call methods in the activities main process. I imagine this is a bad way to do things, but it did work.The issue was with the
AsyncTaskand theService. Regardless of the the way it’s set up, (startForegrond()etc ) a background thread will be paused for a while when the cpu shuts down (either by pressing the lock key, or waiting for the screen to time out). I found it was paused for intervals of about 1 min.The answer is to use
PowerManager.WakeLockand set the flag toPARTIAL_WAKE_LOCK. This will allow the screen to shut down but keep threads running at full speed in the background.Doc here: http://developer.android.com/reference/android/os/PowerManager.html
dont forget to release it when done as it is expensive on the battery.