5

Привет, я использую диспетчер аварийных сигналов для определенного интервала времени в течение 3 минут, и я начал мониторинг. Он работал иногда, и вдруг я заметил, что нерегулярный интервал времени, который неверен! Вы можете видеть в прилагаемом журнале, где в «20-Jul-2016 12:22:03 pm» время меняется! Я подключил телефон, выключил экран и контролировал его! где каждые 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); 

} 

AlarmReceiver:

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 
} 

SimpleWakefulService:

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. 
    } 

enter image description here

ответ

5

Не использовать 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); 
    } 
} 

При поступлении вызова от тревоги, графиком другого сигнала тревоги, чтобы уйти через три минуты. Об этом я доложил here

+0

благодарит за ваш ответ. У меня есть одно сомнение из блога. в методе onReceive, что такое WrappedAlarmManager? что мне нужно использовать в моем коде? – Shadow

+0

тоже промежуток_seven секунд вы упомянули право. что я должен дать? – Shadow

+0

Код доступен на моей учетной записи Github: https://github.com/hoombar/android-training/tree/master/src/net/rdyonline/android_training/alarms –

0

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

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