我有一个AppWidget,它每15秒从服务器请求一次数据。为此,我调用以下startAlarm()
方法以使AlarmManager以给定的偏移量启动服务。服务完成小部件的更新后,它将再次调用此startAlarm()
方法。
static void startAlarm(Context context, Class intent) {
final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
final Intent i = new Intent(context, intent);
final long triggerAtMillis = System.currentTimeMillis() + (refreshRate * 1000);
final PendingIntent p = PendingIntent.getService(
context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
if (m != null) m.setExact(AlarmManager.RTC, triggerAtMillis, p);
}
我重复调用setExact()
而不是单个setRepeating()
来获得低于1分钟的刷新率。只要打开设备屏幕,它就可以正常工作,但是如果它关闭时间太长,则Intent将永远不会发送,并且该服务不会再次运行。我认为它会在一段时间后被系统杀死,并考虑设置一个接收器以在设备屏幕打开时再次触发该服务,但据我了解,这似乎会耗尽电池电量。 / p>
如果我在设备的开发人员选项中查看正在运行的服务,则可以看到该服务仍在运行,这使我认为该服务仍处于启动状态但尚未完成,因此下一次调用startAlarm()
永远不会。因此,在服务的onStartCommand()
中,我尝试返回START_REDELIVER_INTENT
,从查看文档来看这似乎是我想要的,但是仍然挂起。