AlarmManager计划任务在预定义时间后运行

时间:2012-05-06 08:50:46

标签: java android broadcastreceiver alarmmanager android-pendingintent

我正在尝试使用AlarmManager来安排任务在预定义的时间运行。 这个AlarmManager是从我的应用程序初始化的,并且在后台运行(运行良好),当在Broadcast方法中收到onReceive()事件时,我使用context.startService(webServiceIntent);调用服务我试图重新安排这个PendingIntent,在15分钟后打电话说';但由于某些原因,它无法正常工作。所有这一切都会阻止PendingIntent

以下是相关来源:

//Initiliazing AlarmManager from my app
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);             
pendingIntent = PendingIntent.getBroadcast(this, 0, getLocationPollerIntent(), 0);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),  Constant.LOCATION_POLLING_PERIOD, pendingIntent);

//onReceive Method of BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent) {
        Intent webServiceIntent = new Intent(context, LocationNotificationService.class);
        webServiceIntent.putExtra("UPDATED_LOCATION", loc);
    context.startService(webServiceIntent);
}

//Inside LocationNotificationService to reschedule the PendingIntent - This PendingIntent never get called

protected void onHandleIntent(Intent intent) {
       c.set(Calendar.HOUR_OF_DAY, 13);
       c.set(Calendar.MINUTE, 35);
       c.set(Calendar.SECOND, 0);

       AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
       PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, getLocationPollerIntent(), PendingIntent.FLAG_UPDATE_CURRENT);
       alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, c.getTimeInMillis(), Constant.LOCATION_POLLING_PERIOD, pendingIntent);
}

1 个答案:

答案 0 :(得分:0)

问题#1:SystemClock.elapsedRealtime()可能已经过去,如果在setRepeating()来电期间毫秒超过了。确保您指定将来的时间。

问题#2:如果您在设备的当前时区13:35之后运行此代码,那么13:35可能已经过去了。确保您指定将来的时间。

问题#3:许多人在startService()电话和onHandleIntent()之间睡着了,这就是我写WakefulIntentService的原因。