Android AlarmManager未按时启动

Android AlarmManager未按时启动,android,alarmmanager,android-wake-lock,Android,Alarmmanager,Android Wake Lock,我希望根据用户移动设备时间,在每天上午10:30启动AlarmManager。它肯定在上午10:30点火,但问题是,在上午10:30之后,它会在没有时间的情况下重复,就像在每半小时或任何不寻常的时间间隔之后重复一样。 如何预防这个问题?我在成功登录和注册buttoncik()事件时调用此功能。如果用户注销,我也想停止此操作。 我的代码如下: Intent myIntent = new Intent(Register.this, AlarmReceiver.class);

我希望根据用户移动设备时间,在每天上午10:30启动
AlarmManager
。它肯定在上午10:30点火,但问题是,在上午10:30之后,它会在没有时间的情况下重复,就像在每半小时或任何不寻常的时间间隔之后重复一样。

如何预防这个问题?我在成功登录和注册
buttoncik()
事件时调用此功能。如果用户注销,我也想停止此操作。

我的代码如下:

        Intent myIntent = new Intent(Register.this, AlarmReceiver.class);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(Register.this,
                0, myIntent, 0);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        Calendar firingCal = Calendar.getInstance();
        Calendar currentCal = Calendar.getInstance();

        firingCal.set(Calendar.HOUR_OF_DAY, 10);
        firingCal.set(Calendar.MINUTE, 30);
        firingCal.set(Calendar.SECOND, 0);

        long intendedTime = firingCal.getTimeInMillis();
        long currentTime = currentCal.getTimeInMillis();

        if (intendedTime >= currentTime) {

            WakeLocker.acquire(getApplicationContext());

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, intendedTime,
                    AlarmManager.INTERVAL_DAY, pendingIntent);

            WakeLocker.release();

        } else {

            WakeLocker.acquire(getApplicationContext());

            firingCal.add(Calendar.DAY_OF_MONTH, 1);
            intendedTime = firingCal.getTimeInMillis();

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, intendedTime,
                    AlarmManager.INTERVAL_DAY, pendingIntent);

            WakeLocker.release();
        }

代码似乎很好。如果目标版本为19

注意:

从API 19开始,所有重复报警都是不精确的。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,并按上述方式重新安排每次的时间。targetSdkVersion早于API 19的传统应用程序将继续将其所有报警(包括重复报警)视为精确报警

来源:

注意:

        Intent myIntent = new Intent(Register.this, AlarmReceiver.class);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(Register.this,
                0, myIntent, 0);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        Calendar firingCal = Calendar.getInstance();
        Calendar currentCal = Calendar.getInstance();

        firingCal.set(Calendar.HOUR_OF_DAY, 10);
        firingCal.set(Calendar.MINUTE, 30);
        firingCal.set(Calendar.SECOND, 0);

        long intendedTime = firingCal.getTimeInMillis();
        long currentTime = currentCal.getTimeInMillis();

        if (intendedTime >= currentTime) {

            WakeLocker.acquire(getApplicationContext());

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, intendedTime,
                    AlarmManager.INTERVAL_DAY, pendingIntent);

            WakeLocker.release();

        } else {

            WakeLocker.acquire(getApplicationContext());

            firingCal.add(Calendar.DAY_OF_MONTH, 1);
            intendedTime = firingCal.getTimeInMillis();

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, intendedTime,
                    AlarmManager.INTERVAL_DAY, pendingIntent);

            WakeLocker.release();
        }
从API 19开始,传递给此方法的触发时间被视为不精确:在此时间之前不会发出警报,但可能会延迟并在一段时间后发出。操作系统将使用此策略,以便在整个系统中一起“批量”报警,最大限度地减少设备需要“唤醒”的次数,并最大限度地减少电池的使用。一般来说,只要警报安排在遥远的将来,在不久的将来安排的警报不会延迟

在新的批处理策略下,交货订单保证不像以前那样强大。如果应用程序设置了多个警报,则这些警报的实际交付顺序可能与其请求的交付时间顺序不匹配。如果您的应用程序有很强的排序需求,那么您可以使用其他API来获得必要的行为;请参见设置窗口(int,long,long,pendingent)和设置精确窗口(int,long,pendingent)

targetSdkVersion在API 19之前的应用程序将继续获得以前的报警行为:所有计划的报警都将被视为精确的

来源:


请检查这是否符合您的要求。

您的targetSdkVersion是什么?targetSdkVersion是19谢谢您的回复。我会检查一下,让你知道它是否适合我。