2016-11-03 5 views
2

Я пытаюсь настроить будильник на каждые 5 минут.Плановая аварийная сигнализация никогда не вызывает приемный класс

Это код для установки будильника:

@Override 
public void scheduleAlarmManager() { 
    Timber.i("After SignIn sets AlarmManager"); 
    // broadcast 
    Intent intent = new Intent(this, PatientAlarmReceiver.class); 
    intent.setAction(PATIENT_START_ALARM_ACTION); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
      this, REQUEST_CODE, intent, 0); 

    // and set alarmManager 
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

    Calendar currentCal = Calendar.getInstance(); 
    long currentTIme = currentCal.getTimeInMillis(); 

    // if there's not an Alarm already set then set one 
    if (!isAlarmSet(this)) { 
     Timber.i("Alarm not set - so set one"); 
     alarm.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
       currentTIme + TWO_MINS_DURATION, TWO_MINS_DURATION, pendingIntent); 
    } 

} 

и я могу подтвердить, что я установить сигнализацию правильно, так как я вижу в моем LogCat сообщения я вхожу с Timber.

класс

Мой ресивер:

public class PatientAlarmReceiver extends BroadcastReceiver { 

public static final String TAG = "PATIENT-ALARM-RECEIVER"; 
public static final String PATIENT_START_ALARM_ACTION = "bp.headsup.receivers.alarm.patient"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i(TAG, "Inside OnReceive Patient"); 
    Timber.i("Inside OnReceive Patient"); 

    if (intent == null || intent.getAction() == null) { 
     return; 
    } 

    String action = intent.getAction(); 
    if (PATIENT_START_ALARM_ACTION.equalsIgnoreCase(action)) { 
     onStartCheckForConnectionRequest(context); 
    } 
} 

/** 
* If is connected to network starts services 
*/ 
private void onStartCheckForConnectionRequest(Context context) { 
    NetworkUtils networkUtils = new NetworkUtils(context); 
    if (networkUtils.isNetworkConnected()) { 
     Intent checkForConnRequestIntent = new Intent(context, PatientCheckForConnectionRequestService.class); 
     context.startService(checkForConnRequestIntent); 
     Timber.i("Starts Service From PatientALARMMANAGER"); 
    } 
} 

}

И Я в манифесте:

 <!-- Receivers --> 
    <receiver 
     android:name="bp.headsup.receivers.PatientAlarmReceiver" /> 

Кроме того, если я бегу: adb shell dumpsys alarm Я вижу:

ELAPSED_WAKEUP #0: Alarm{42d804e8 type 2 bp.headsup.mock} 
operation=PendingIntent{42d0c230: PendingIntentRecord{42d0f000 bp.headsup.mock broadcastIntent}} 

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

Проблема в том, что я никогда не читал в logcat сообщения, которые у меня есть в onReceive, на моем классе приемника, и, очевидно, никаких служб не запускается. Кто-нибудь может помочь с этим? Я использую устройство, которое работает с kitKat 4.4 (api 19), но я тоже пробовал его с эмулятором, и результат был таким же.

+0

Я думаю, что вы не установили действие (BOOT_COMPLETED) получателя в манифесте. –

+1

Вы устанавливаете тревогу прошедшего времени, но вы даете ей время начала «настенных часов». Либо замените будильник на тип «RTC», либо получите время запуска из «SystemClock.elapsedRealtime()». –

+1

@MikeM. Верный! это сработало! благодаря – Mes

ответ

1

Вы устанавливаете будильник ELAPSED_REALTIME, который основан на времени, прошедшем с момента последней загрузки. Тем не менее, вы передаете это время запуска, основанное на «настенных часах», поэтому ваш будильник действительно установлен довольно далеко в будущем.

Вы можете либо изменить будильник на RTC, либо получить начальное время от SystemClock.elapsedRealtime(). Учитывая ваше описанное поведение, сохранение истекшего типа и корректировка времени начала кажутся подходящими.