2011-10-17 62 views
2

我无法理解屏幕超时功能以及如何影响代码在我的活动中运行。当屏幕超时时onPause()会被调用吗?是在屏幕超时时调用的活动onPause方法?

我有一个活动和相关的服务运行一个AsyncTask,它从60秒倒计时。我希望能够锁定屏幕,并在计时器结束时,开始一项新的服务和新的活动,发出警报并振动手机。当用户唤醒手机时,他们应该看到新的活动,其显示正在通过新服务的广播接收器进行更新。

我发现的是,行为是非常不可预测的。一旦屏幕超时,它通常会发出警报,并在锁定屏幕下显示新的活动,但这需要2-4分钟的时间,有时根本不会发生。我似乎手动锁定屏幕获得更好的结果,而不是等待超时,但它仍然不可预知,并且每部手机都不相同。

如果有人对发生了什么事情有任何想法/建议,甚至是否这种方法是明智的,将不胜感激。

问候

+0

你的代码是什么?我理解你的问题有一些困难。 – IvoryCirrus 2011-10-17 13:13:47

+0

经过更多调查后,我发现手机在屏幕超时时似乎完全睡眠。在logcat中查看时,有一分钟的时间内没有任何日志产生(我自己和系统日志)。无论如何强迫服务被赋予高优先级?我曾尝试在我的服务中使用startForeground(),但行为相同。 – 2011-10-18 09:44:35

回答

2

好了,我已经找到了答案,我想我的问题是有点令人费解,首先,所以我会尽量回答的各个部分,以及增加我的实际解决方案。 ...

我有一个Activity开始ServiceService(其中包括AsyncTask)应该在后台运行,监控加速计并倒计时器。然后Service周期性地发送广播IntentActivity,当广播包含某些数据时,Activity需要运行一些代码。这一切都需要在屏幕关闭的情况下发生。

我的发现是,是的,打在屏幕锁定的情况下,Activity不运行onPause(),但仍是完全能够在内部BroadcastReciever类来执行代码,因此这可以拨打活动主要工艺方法。我想这是一种不好的做事方式,但它确实有效。

问题出在AsyncTaskService。无论设置的方式如何(startForegrond()等),后台线程在CPU关闭时会暂停一段时间(通过按下锁定键或等待屏幕超时)。我发现它停顿了大约1分钟的时间间隔。

答案是使用PowerManager.WakeLock并将标志设置为PARTIAL_WAKE_LOCK。这将允许屏幕关闭,但保持线程在后台全速运行。

文件位置:http://developer.android.com/reference/android/os/PowerManager.html

不要忘记做的时候,因为它是电池昂贵的释放。

相关问题