SetRepeating() AlarmManager повторяет через 1 минуту независимо от того, какое время установлено (5 секунд в этом случае, API 18+)

Я установил время повторения до 5 секунд. Первый тост появляется через 5 секунд, но все последующие повторяются через 1 минуту.
Я пробовал код с setRepeating(), но он все равно не работает.
вот мой код:

public void constructJob(){

    Intent alertIntent = new Intent(this, AlarmManagerService.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            this, 0,
            alertIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(
            AlarmManager.RTC_WAKEUP,
            GregorianCalendar.getInstance().getTimeInMillis(),
            repeatTime(),
            pendingIntent
    );

}

public long repeatTime(){
    return 5000;
}

AlarmManagerService.java

public class AlarmManagerService extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
             Toast.makeText(context, "5 seconds have passed",
                            Toast.LENGTH_SHORT).show();
}

Ответ 1

Документация должна быть обновлена. По моему мнению, для Android 5.1 (версия API версии 22) для повторения сигналов тревоги существует минимальный период в 1 минуту, а в будущем сигналы тревоги не могут быть установлены менее 5 секунд.

Если вам нужно выполнить работу в течение одной минуты, просто установите будильник напрямую, затем установите следующий из этого обработчика аварий и т.д.

Если вам нужно выполнить работу в течение 5 секунд, отправьте ее в обработчик вместо использования диспетчера аварийных сигналов?

Ответ 2

Не используйте setRepeating() или setInExactRepeating, он не будет повторяться ровно через 5 секунд. Вместо этого попробуйте планировать будильник один раз, а затем перепланировать его снова в методе onReceive() примерно так. Это будет повторяться через определенный промежуток времени (в данном случае 5 секунд)

MainActivity.java

public class MainActivity extends AppCompatActivity {

Button btnStartAlarm, btnStopAlarm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnStartAlarm = (Button) findViewById(R.id.btnStartAlarm);
    btnStopAlarm = (Button) findViewById(R.id.btnStopAlarm);

    Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, intent, 0);

    final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    btnStartAlarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
        }
    });

    btnStopAlarm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alarmManager.cancel(pendingIntent);
        }
    });
}
 }

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {
public AlarmReceiver() {
}

@Override
public void onReceive(Context context, Intent intent) {

    Log.d("Javed", "onReceive called");
    Toast.makeText(context, "onReceive called", Toast.LENGTH_LONG).show();

    Intent intent1 = new Intent(context, AlarmReceiver.class);
    final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 100, intent1, 0);
    final AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
}
  }

Ответ 3

Попробуйте этот код:
Calendar cal = Calendar.getInstance(); alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 5000, pendingIntent);

Ответ 4

Попробуйте выполнить следующий код:

Long time = new GregorianCalendar().getTimeInMillis() +  3000;
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,time,5000, pendingIntent);

Как только вы запустите этот код, будильник начнет срабатывать через 3 секунды и каждые 5 секунд после этого.

Также попробуйте использовать WakefulBroadcastReceiver вместо BroadcastReceiver, так как похоже, что через некоторое время телефон переходит в режим доз (если вы находитесь в android M). Убедитесь, что вы включили разрешение WAKE_LOCK, чтобы использовать его правильно.

Кроме того, вы должны иметь в виду, что первый триггер срабатывания будильника не будет до запрошенного времени, но это может не произойти почти через полный интервал после этого времени. Кроме того, в то время как общий период повторяющегося сигнала тревоги будет запрошен, время между любыми двумя последовательными сигналами тревоги может меняться.

Дополнительно

setInExactRepeating() не гарантирует точность времени запуска. Вы можете использовать setRepeating() до API 19, но начиная с подачи аварийной информации API 19 (KITKAT) неточно: ОС сбрасывает аварийные сигналы, чтобы минимизировать пробуждения и использование батареи. Что вы можете сделать, установите неповторяющийся аварийный сигнал, и когда будильник выйдет, вы можете reset снова включить будильник в вашем BroadcastReceiver. Существуют новые API-интерфейсы для поддержки приложений, которым требуются строгие гарантии доставки; см. setWindow(int, long, long, PendingIntent) и setExact(int, long, PendingIntent). Приложения, чья targetSdkVersion ранее, чем API 19, будут продолжать видеть предыдущее поведение, при котором все сигналы тревоги отправляются точно по запросу.

Ссылка

setInexactRepeating() Официальная документация

fooobar.com/questions/501328/...

Ответ 5

Попробуйте это

    Calendar cur_cal = new GregorianCalendar();

    PendingIntent pintent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarm.cancel(pintent);
    alarm.setRepeating(AlarmManager.RTC, cur_cal.getTimeInMillis(), interval, pintent);

Ответ 6

Попробуйте это

public void constructJob(){
Intent alertIntent = new Intent(this, AlarmManagerService.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
        this, 0,
        alertIntent,
        PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP,
        GregorianCalendar.getInstance().getTimeInMillis(),
        1000*5,
        pendingIntent);

}

Ответ 7

У меня была точно такая же проблема. Я потратил несколько часов на отладку, и, наконец, я узнал, что если время повторения установлено менее чем на одну минуту, он всегда срабатывает будильник в расписании на одну минуту!?

Я последовал этому примеру: http://www.compiletimeerror.com/2015/02/how-to-make-alarm-repeat-in-android-code.html#.Vp5UrCorKM8

и он показывает срабатывание сигнализации на 8 секунд, но в моем случае это не так.

Чем я пытался с настройкой повторяющегося времени на несколько минут, и он работал нормально. Я также увлекаюсь тем, что сигнал тревоги от приемника дает более точное время повторения (один приемник предназначен для запуска диспетчера аварийных сообщений и вызван настраиваемым фильтром)