AlarmManager使用setExact重复任务停止工作

时间:2017-04-20 07:20:12

标签: java android broadcastreceiver alarmmanager intentservice

我知道使用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秒。

显然广播报告和服务都是在清单中声明的​​,否则它们根本就不会被解雇。

我做错了什么?

0 个答案:

没有答案