我知道使用setExact来执行重复任务是一种不好的行为,但它是执行任务的必要条件。
我在运行KitKat的三星Galaxy Note 8上工作,我正在使用setExact
中的AlarmManager
方法来安排IntentService
特定时间。我不得不放弃setRepeating
,因为文档说从SDK 19开始,它将不精确。
当我的BroadcastReceiver
被解雇时,我会启动我的服务,然后通过另一次调用setExact
重新安排它,从而模仿19岁以前的旧setRepeating
。< / p>
每 30分钟会发生这种情况。
查看我的日志,我可以看到我的服务是从晚上5点(我开始播放节目时)到凌晨4点,按照预期 30分钟间隔触发,然后......没有。 在写这篇文章时,它仍然不会被触发。
我也从一开始就关闭了应用程序,以便在应用程序未被使用时查看是否有效。但是在Android Studio中,监视器确实显示进程存在。
这是第一次安排服务的代码:
final Intent activityDataFetcherIntent = new Intent(appContext, ServiceReceiver.class);
final PendingIntent pendingIntent = PendingIntent.getBroadcast(appContext, 4334, activityDataFetcherIntent, 0);
final AlarmManager manager = (AlarmManager) appContext.getSystemService(Context.ALARM_SERVICE);
manager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(30), pendingIntent);
最后这是来自 BroadcastReceiver 的代码:
public final static class ServiceReceiver extends BroadcastReceiver {
@Override
public final void onReceive(final Context context, final Intent intent) {
final Intent service = new Intent(context, ActivityFetcherService.class);
context.startService(service);
// Rescheduling for 30 minutes later
final Intent activityDataFetcherIntent = new Intent(context, getClass());
final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 4334, activityDataFetcherIntent, 0);
final AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(30), pendingIntent);
}
}
这也意味着我在服务仍在运行时重新安排服务。但总的来说,服务最多只运行10-15秒。
显然广播报告和服务都是在清单中声明的,否则它们根本就不会被解雇。
我做错了什么?