我对Android很新,遇到了一个问题,我想了解。问题是,当我的智能手机显示屏关闭时,java.util.concurrent.ScheduledExecutorService
似乎没有发出任务。我之前使用的java.util.Timer
没有此问题,但由于需要在停止ScheduledExecutorService
后等待任务执行结束,因此正在转换到Timer
。计时器用于后台运行的Service
。
注意:使用AlarmManager
不是一个选项,因为我想了解ScheduleExecutorService
的问题,否则将再次使用Timer
(同步关机)。
以下是如何安排任务:
mScheduler = Executors.newSingleThreadScheduledExecutor();
mScheduler.scheduleAtFixedRate(mTask, 1, 1, TimeUnit.SECONDS);
更清楚地说明目的:我试图定期更新通知以及部分用户界面,如果设备想要进入“睡眠”模式,则不需要这样做,但我需要处理这种情况。我认为理解为什么ScheduledExecutorService
与Timer
相比的行为方式将帮助我处理它。
更新
根据Chris Stratton的建议,我使用BroadcastReceiver
来接收Intent.ACTION_SCREEN_ON
和Intent.ACTION_SCREEN_OFF
意图来暂停/恢复ScheduledExecutorService
,这就像一个魅力。然而,在拨打电话时,ScheduledExecutorService
似乎存在另一个问题,执行不会停止,但似乎会以某种方式受到限制。仅当由于接近传感器而关闭屏幕时才会出现这种情况(在这种情况下也没有接收到意图)......
答案 0 :(得分:1)
当屏幕关闭时,如果没有其他应用程序持有WakeLock,则CPU暂停。
在屏幕关闭时,只要您需要完成任务,就应该使用PARTIAL WakeLock。
并确保在完成所有的ackground工作后立即释放它。