我的应用程序有一个实时模块,应该每隔60秒ping一次服务器。如果没有这个,连接将被删除,设备将需要重新连接。
第一次尝试是使用Thread.Sleep使ping线程以所需频率运行。第二次尝试是使用ScheduleExecutorService。两者都运行良好,但只有当设备正在充电或屏幕打开时。
读了一下之后,我意识到这种行为的发生是因为设备的处理器休眠,这会干扰定时器。因此,建议使用AlarmManager ...
开始使用后,我注意到我的设备屏幕开始频繁开启,我认为这是由警报管理员唤醒设备的。#39;。我搜索了一下,看看如何使用AlarmManager执行一些后台操作,即使设备处于休眠状态,也没有打开屏幕,但没有找到任何内容。
那么,无论如何都有使用AlarmManager或其他方法来实现这一目标?即使设备处于休眠状态,也可以在不打开屏幕的情况下执行后台任务?
PS1:我知道这种方法对电池消耗的影响以及不打开屏幕的要求是尽量减少它的影响。PS2:后台服务正在使用AlarmManager的意图。
答案 0 :(得分:2)
警报管理器无法打开屏幕。来自文档,
当闹钟响起时,系统会广播已为其注册的Intent,如果目标应用程序尚未运行,则会自动启动它。
我在我的代码中使用它并且它不会打开屏幕,除非我明确设置了启用它的唤醒锁定策略。看看WakeLock
从API级别17开始,不推荐使用最后3个。
我建议你为你的任务使用PARTIAL_WAKE_LOCK。或者您可以查看WakefulBroadcastReceiver
答案 1 :(得分:0)
如果您使用的是onReceive()
方法,则可能会获得您的唤醒锁。删除onReceive()
中的WakeLock参数。