Диспетчер аварийных сигналов не работает в заданный интервал времени

Привет, я использую диспетчер тревог для определенного интервала времени в течение 3 минут, и я начал мониторинг. Иногда это работало, и вдруг я заметил, что есть неправильный временной интервал, который неверен! Вы можете увидеть в прикрепленном журнале, что на "20 июля 2016 г., 12:22:03" время меняется! Подключил телефон и выключил экран и мониторил! где каждые 3 минуты я обращаюсь к серверу и получаю ответ как 1. Но в какой-то момент для обращения к серверу требуется 5 минут! Почему возникла эта странная проблема?

Вот код.

 public void startAt3() {
    Intent alarmIntent = new Intent(ActivityTracking.this, AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(ActivityTracking.this, 0, alarmIntent, 0);
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                        /* Set the alarm */
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    /* Repeating on every 3 minute interval */
    manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            calendar.getTimeInMillis(),
            180000L, pendingIntent);
    String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
    Log.e("alarm",mydate);

}

Тревожный приемник:

   public class AlarmReceiver extends WakefulBroadcastReceiver    {//AlarmReceiver class
@Override
public void onReceive(Context context, Intent intent) {//onReceive method
    String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
    Log.e("alarm",mydate);
    Intent service = new Intent(context, SimpleWakefulService.class);//intent to call another class
    // Start the service, keeping the device awake while it is launching.
    startWakefulService(context, service);//service started
}

Простой вейкфулсервис:

    public class SimpleWakefulService extends IntentService {
      public SimpleWakefulService() {
        super("SimpleWakefulService");//instantiates simpleWakefulService

    }
     @Override
     protected void onHandleIntent(Intent intent) {
        Log.e("simpleWakeful","simpleWakeful");
      serviceCall(this); //here is downloadTaskMethod called and getting response as 1.
  }

введите здесь описание изображения




Ответы (2)


Не используйте setInexactRepeating. Это, как следует из названия, не планирует срабатывание будильника в точное время.

Вы можете использовать что-то вроде этого:

public void scheduleSingleAlarm(Context context) {
    Intent intent = new Intent(context, NotificationReceiver.class);
    PendingIntent pendingUpdateIntent = PendingIntent.getBroadcast(context,
            SINGLE_ALARM_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    Calendar futureDate = Calendar.getInstance();
    futureDate.add(Calendar.MINUTE, 3);

    setSingleExactAlarm(futureDate.getTime().getTime(), pendingUpdateIntent);
}

@SuppressLint("NewApi")
private void setSingleExactAlarm(long time, PendingIntent pIntent) {
    if (android.os.Build.VERSION.SDK_INT >= 19) {
        mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pIntent);
    } else {
        mAlarmManager.set(AlarmManager.RTC_WAKEUP, time, pIntent);
    }
}

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

person Ben Pearson    schedule 20.07.2016
comment
Спасибо за ответ. У меня есть одно сомнение из блога. в методе onReceive, что такое WrappedAlarmManager? что мне нужно использовать в моем коде? - person Shadow; 20.07.2016
comment
также interval_seven секунд, которые вы правильно упомянули. что я должен дать? - person Shadow; 20.07.2016
comment
Код доступен в моей учетной записи Github здесь: github.com/hoombar/android-training/tree/master/src/net/ - person Ben Pearson; 20.07.2016
comment
Без проблем. Я также обновил сообщение, чтобы напрямую ссылаться на код, спасибо. - person Ben Pearson; 20.07.2016
comment
сэр, у меня есть вопросы, приведенный выше код будет повторяться каждый день? Потому что мне нужно создать будильник, который выполняет задачу, повторяющуюся каждый день. - person Sen; 16.03.2017

Из официальной документации по AlarmManager видно, что, начиная с Android версии 19 (KitKat), запланированные будильники будут неточными, даже если они были помечены как точные (хотя у вас уже есть inexactRepeating()).

Аварийные сигналы будут объединены с системными событиями, чтобы свести к минимуму пробуждение устройства и использование батареи, что вы и видите. Это по дизайну.

person ucsunil    schedule 20.07.2016