質問

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 Activity that was starting a Service. The Service (which included an AsyncTask) was supposed to run in the background, monitoring the accelerometer and counting down a timer. The Service was then periodically sending a broadcast Intent to the Activity, when the broadcast contained certain data, the Activity needed to run some code. This all needed to happen with the screen off.

My findings are that, yes, when hitting the screen lock, the Activity does run onPause(), but is still fully able to execute code in the internal BroadcastReciever class, 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 AsyncTask and the Service. 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.WakeLock and set the flag to PARTIAL_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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top