繁体   English   中英

Android AlarmManager发送广播不准时

[英]Android AlarmManager send Broadcast not on time

我使用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());
}

嗨,您使用的是setRepeating方法,它不会在准确的时间发出警报.Alarm Manager会强烈劝阻除系统应用之外的其他应用准确触发警报,以实现更好的电池优化。因此,如果您想在特定时间触发警报,则可以使用setExact()方法这也不会给您完整的保证,但是它将为您提供最准确的保证。虽然一次设置多个警报,请确保在`

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

在这里您给了2作为ID,不同的警报应该不同。

由于使用KitKat,set和setRepeating API并不精确。 如果您绝对需要警报在特定时间运行,请使用setExact。 如果警报时间不是很紧急,请考虑使用setWindow代替。

没有setExactRepeating,因此如果需要,则需要使用setExact,它们可以重新布防警报。 但是,除非您做的是时间紧迫的工作,否则不建议这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM