Android AlarmManager未按时发送广播

Android AlarmManager未按时发送广播,android,broadcastreceiver,alarmmanager,android-broadcast,android-broadcastreceiver,Android,Broadcastreceiver,Alarmmanager,Android Broadcast,Android Broadcastreceiver,我使用AlarmManager按时设置两个动作 第一个动作设定在10:00:00,第二个动作设定在10:15:00 我可以得到两个动作广播 并在10:00:03获得第一个动作广播(可以) 但是在10:29:15,14分钟晚了,第二次行动广播 如何让AlarmManager能够按时发送广播 设置AlarmManager代码: @Override public void onCreate() { setSchedule(); } private void setSchedule(){

我使用AlarmManager按时设置两个动作

第一个动作设定在10:00:00,第二个动作设定在10:15:00

我可以得到两个动作广播

并在10:00:03获得第一个动作广播(可以)

但是在10:29:15,14分钟晚了,第二次行动广播

如何让AlarmManager能够按时发送广播

设置AlarmManager代码:

@Override
public void onCreate() {
    setSchedule();
}
private void setSchedule(){
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Calendar offCal = Calendar.getInstance();
    offCal.set(Calendar.HOUR_OF_DAY, 10);
    offCal.set(Calendar.MINUTE, 15);
    offCal.set(Calendar.SECOND, 00);
    Intent offIntent = new Intent(this, AlarmReceiver.class);
    offIntent.setAction(AlarmReceiver.ALUM_SCREEN_OFF);
    PendingIntent offPending = PendingIntent.getBroadcast(this, 1,
            offIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    am.setRepeating(AlarmManager.RTC, offCal.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, offPending);

    Intent onIntent = new Intent(this, AlarmReceiver.class);
    onIntent.setAction(AlarmReceiver.ALUM_SCREEN_ON);
    Calendar onCal = Calendar.getInstance();
    onCal.set(Calendar.HOUR_OF_DAY, 10);
    onCal.set(Calendar.MINUTE, 00);
    onCal.set(Calendar.SECOND, 00);
    PendingIntent onPending = PendingIntent.getBroadcast(this, 2,
            onIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    am.setRepeating(AlarmManager.RTC_WAKEUP, onCal.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, onPending);
}
public class AlarmReceiver extends BroadcastReceiver {
    public static final String ALUM_SCREEN_ON = "screenOn";
    public static final String ALUM_SCREEN_OFF = "screenOff";
    private static final String TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.d(TAG, "get braodcast action:"+intent.getAction());
}
接收器代码:

@Override
public void onCreate() {
    setSchedule();
}
private void setSchedule(){
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Calendar offCal = Calendar.getInstance();
    offCal.set(Calendar.HOUR_OF_DAY, 10);
    offCal.set(Calendar.MINUTE, 15);
    offCal.set(Calendar.SECOND, 00);
    Intent offIntent = new Intent(this, AlarmReceiver.class);
    offIntent.setAction(AlarmReceiver.ALUM_SCREEN_OFF);
    PendingIntent offPending = PendingIntent.getBroadcast(this, 1,
            offIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    am.setRepeating(AlarmManager.RTC, offCal.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, offPending);

    Intent onIntent = new Intent(this, AlarmReceiver.class);
    onIntent.setAction(AlarmReceiver.ALUM_SCREEN_ON);
    Calendar onCal = Calendar.getInstance();
    onCal.set(Calendar.HOUR_OF_DAY, 10);
    onCal.set(Calendar.MINUTE, 00);
    onCal.set(Calendar.SECOND, 00);
    PendingIntent onPending = PendingIntent.getBroadcast(this, 2,
            onIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    am.setRepeating(AlarmManager.RTC_WAKEUP, onCal.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, onPending);
}
public class AlarmReceiver extends BroadcastReceiver {
    public static final String ALUM_SCREEN_ON = "screenOn";
    public static final String ALUM_SCREEN_OFF = "screenOff";
    private static final String TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.d(TAG, "get braodcast action:"+intent.getAction());
}

由于KitKat,set和setRepeating API并不精确。如果您确实需要在特定时间运行警报,请使用setExact。如果警报时间不重要,请考虑使用SETWORK。< /P>
没有setExactRepeating,所以如果您需要,您需要使用setExact并重新设置警报。但是,除非您正在做时间关键的事情,否则不建议这样做。

因为KitKat设置和设置重复API并不精确。如果您确实需要在特定时间运行警报,请使用setExact。如果警报时间不重要,请考虑使用SETWORK。< /P>
没有setExactRepeating,所以如果您需要,您需要使用setExact并重新设置警报。但除非你在做时间紧迫的事情,不建议这样做。

您好,您正在使用setRepeating方法,该方法不会在准确的时间发出警报。alarm manager将强烈建议系统应用程序以外的其他应用程序准确触发警报,以更好地优化电池。因此,如果您想在特定时间触发警报,则可以使用setExact()此方法也不会为您提供完整的gaurantee,但会为您提供最精确的gaurantee。在一次设置多个报警时,请确保您在`

PendingIntent onPending = PendingIntent.getBroadcast(this, 2,
            onIntent, PendingIntent.FLAG_UPDATE_CURRENT);

这里你给2作为id,它应该是不同的不同的报警

您好,您使用的是setRepeating方法,它不会在准确的时间发出警报。alarm manager将强烈建议系统应用程序以外的其他应用程序准确触发警报,以便更好地优化电池。因此,如果您想在特定时间触发警报,则可以使用setExact()此方法也不会为您提供完整的gaurantee,但会为您提供最精确的gaurantee。在一次设置多个报警时,请确保您在`

PendingIntent onPending = PendingIntent.getBroadcast(this, 2,
            onIntent, PendingIntent.FLAG_UPDATE_CURRENT);
这里你给2作为id,它应该是不同的不同的报警