使用AlarmManager计划的Android服务在几天后停止调用

使用AlarmManager计划的Android服务在几天后停止调用,android,android-intent,scheduled-tasks,alarmmanager,android-pendingintent,Android,Android Intent,Scheduled Tasks,Alarmmanager,Android Pendingintent,我一直在尝试使用AlarmManager类安排一个Android服务重复运行,但几天后该服务就停止了调用。最初,我一直在使用以下代码来尝试实现这一点: Intent alarmIntent = new Intent(currentActivity.getApplicationContext(), AlarmReceiver.class); PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(currentActivity.g

我一直在尝试使用AlarmManager类安排一个Android服务重复运行,但几天后该服务就停止了调用。最初,我一直在使用以下代码来尝试实现这一点:

Intent alarmIntent = new Intent(currentActivity.getApplicationContext(), AlarmReceiver.class);
PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(currentActivity.getApplicationContext(),
            AppManager.ALARM_PENDING_INTENT_REQUEST_CODE,
            alarmIntent,
            PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager = (AlarmManager)currentActivity.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis(),
            interval,
            pendingAlarmIntent);
对于接收器:

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context _context, Intent _intent){
        Intent serviceIntent = new Intent(_context.getApplicationContext(), PostLocationService.class);
        _context.getApplicationContext().startService(serviceIntent);
    }
}
这项工作持续了几天,然后突然停止。因此,我将代码更改为最初向接收器广播一次,然后在每次运行服务时重新向接收器广播。我使用以下代码执行此操作:

Intent alarmIntent = new Intent(currentActivity.getApplicationContext(),     AlarmReceiver.class);
PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(currentActivity.getApplicationContext(),
            AppManager.ALARM_PENDING_INTENT_REQUEST_CODE,
            alarmIntent,
            PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager = (AlarmManager)currentActivity.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP,
            interval,
            pendingAlarmIntent);
不幸的是,这也有同样的结果;服务在几天后停止执行

我还注册了一个接收器,当设备启动以重新启动AlarmManager调用时,它的代码与上面的代码相同


我错过什么了吗?对于这种类型的持续重复执行,有没有比上述两种方法更好的方法?

根据开发者网站:

注意:从API 19(KITKAT)开始,警报传递是不精确的:操作系统将切换警报,以尽量减少唤醒和电池使用。有新的API支持需要严格交付保证的应用程序;请参见设置窗口(int,long,long,pendingent)和设置精确窗口(int,long,pendingent)。targetSdkVersion早于API 19的应用程序将继续看到之前的行为,其中所有警报都会在请求时准确发送 大宗报价


希望它能有所帮助

AlarmManager.set在大多数情况下仍然正常。当您使用set()时,您是在告诉报警管理器您希望该操作在该时间左右发生,但操作系统可以做出决定以优化电池寿命或避免太多报警触发得太近。您的服务一定是崩溃了。当它启动和停止时,将其记录到文件或web服务器上,这样您就可以发现它是否正在崩溃。此外,如果手机正在重新启动,并且报警丢失,则需要注册BroadcastReceiver以捕获{android.intent.action.BOOT_COMPLETED},为此需要编辑应用程序清单文件。