2

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

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

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

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

问候

4

1 回答 1

2

好的,所以我找到了答案,我认为我的问题一开始有点令人费解,所以我将尝试回答各个部分,并添加我的实际解决方案....

我有一个Activity正在启动的Service. (Service包括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

完成后不要忘记释放它,因为它对电池很昂贵。

于 2011-10-18T12:27:47.083 回答