是一个在屏幕超时时调用的Activities onPause方法?

时间:2011-10-17 12:58:13

标签: java android service screen onpause

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

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

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

如果有人有任何关于最新情况的想法/建议,即使这种做法是否合理,我们将非常感激。

此致

1 个答案:

答案 0 :(得分:2)

好的,所以我找到了答案,我认为我的问题有点复杂,所以我会尝试回答各个部分,以及添加我的实际解决方案....

我有Activity开始ServiceService(包括AsyncTask)应该在后台运行,监控加速度计并倒计时。然后Service定期向Intent发送广播Activity,当广播包含某些数据时,Activity需要运行一些代码。这一切都需要在关闭屏幕时发生。

我的发现是,是的,当点击屏幕锁定时,Activity确实运行onPause(),但仍能完全执行内部BroadcastReciever类中的代码,因此这可以调用活动主进程中的方法。我认为这是一种糟糕的做事方式,但确实有效。

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

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

Doc在这里:http://developer.android.com/reference/android/os/PowerManager.html

不要忘记在完成后释放它,因为电池价格昂贵。