2016-12-03 4 views
0

Я пытаюсь создать простую приложение для будильника в Android Studio, но у меня возникли проблемы с определением того, как правильно использовать AlarmManager310 и BroadcastReceiver.Служба регистрации Android Studio не запускается автоматически

В моей MainActivity я инстанцирован все, что нужно для AlarmManager (Intent, PendingIntent, и я с помощью календаря провести время, полученное от TimePicker). У меня есть эта линия в onClick случае кнопка в

alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent); 

Приемник называется AlarmReceiver и в его onReceive() я, сейчас,

Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show(); 
Log.e("Receiver", "Receiver entered"); 

Для целей тестирования, установить время будильника, чтобы быть одним минуты от текущего времени, когда я отлаживаю приложение. После установки времени я нажимаю кнопку, которая устанавливает AlarmManager. Сообщение Toast и сообщение Log не отображаются самостоятельно, как только время становится сигналом тревоги. Они отображаются только в том случае, если я нажимаю кнопку, когда время находится в пределах минуты, которое является временем будильника.

Например, если время будильника равно 3:00, а текущее время равно 2:59, и я нажал кнопку, чтобы установить AlarmManager. Когда это становится 3:00, сообщения не отображаются. Они будут отображаться только в том случае, если я нажму кнопку в течение минуты 3:00.

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

Я гарантировал, что значения времени прав и что приемник задается в попытке manifest

+0

Вы отправили намерение начать обслуживание ?? – Dhruv

+0

Да, я это сделал. Я добавил службу для воспроизведения mp3-файла для целей тестирования. Проблема в том, что он по-прежнему не запускается автоматически, когда текущее время находится в тревожном времени. Я должен нажать кнопку – bitscuit

ответ

0

к чему-то вроде этого:

private static void setUpAlarm(final Context context, final Intent    intent, final int timeInterval){ 
final AlarmManager am = (AlarmManager)  context.getSystemService(Context.ALARM_SERVICE); 
final PendingIntent pi = PendingIntent.getBroadcast(context, timeInterval, intent, 0); 
am.cancel(pi); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
{ 
    final AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(System.currentTimeMillis() + timeInterval, pi); 
    am.setAlarmClock(alarmClockInfo, pi); 
} 
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
    am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInterval, pi); 
else 
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInterval, pi); 
} 
+0

, вы ошибаетесь. этот код не обрабатывает новый API – Vyacheslav

+0

futhermore 'setAlarmClock' действительно ужасен – Vyacheslav

0

Я действительно рекомендую использовать этот код:

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    if (currentapiVersion < android.os.Build.VERSION_CODES.KITKAT){ 
     am.set(AlarmManager.RTC_WAKEUP, nexttime, pi); 
    } else if (currentapiVersion < android.os.Build.VERSION_CODES.M) { 
      am.setExact(AlarmManager.RTC_WAKEUP, nexttime, pi); 
     } else { 
      am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nexttime, pi); 
     } 
Смежные вопросы