2016-12-06 5 views
-1

У меня есть TimePicker и Button, и я хочу установить будильник, когда пользователь нажимает на Button в указанное время.BroadcastReceiver срабатывает с задержкой

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

Это код, который я прямо сейчас:

О классе сигнализации (код refered к BroadcastReceiver)

AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE); 
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class); 
PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0); 

Calendar cal= Calendar.getInstance(); 

cal.set(Calendar.MONTH,cal.get(Calendar.MONTH)); 
cal.set(Calendar.YEAR,cal.get(Calendar.YEAR)); 
cal.set(Calendar.DAY_OF_MONTH,cal.get(Calendar.DATE)); 
cal.set(Calendar.HOUR_OF_DAY,hour); 
cal.set(Calendar.MINUTE,minutes); 


alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1000 * 60 * 5, alarmIntent); 

где hour и minutes являются часы и минуты извлекаются из TimePicker ,

О классе AlarmReceiver

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("prove", "We enter on BroadcastReceiver"); 
    } 
} 

На Manifest.xml

<receiver 
    android:name=".AlarmReceiver" 
    android:enabled="true" > 
</receiver> 

Например, я поставил журнал, чтобы увидеть, что час я извлечения из TimePicker перед тем показе журнала от BroadcastReceiver. Я нажал ее на 16:48 (на TimePicker), и это результат:

12-06 16:47:02.951 7980-7980/com.project.user.project D/prove: hour: 16:48 
12-06 16:50:23.727 7980-7980/com.project.user.project D/prove: We enter on BroadcastReceiver 
12-06 17:00:01.070 7980-7980/com.project.user.project D/prove: We enter on BroadcastReceiver 

Как вы можете видеть, BroadcastReceiver был уволен два раза в 16:50 и 17:00, когда я полагаю, что они должны стрелять в 16:48 и 16:53 потому что я установил, что между ними будет задержка в 5 минут, а не 10 минут, как в этом случае.

Итак, что я могу сделать, чтобы запустить будильник в точное время и не выстрелить его с задержкой? Не хватает ли какой-либо конфигурации?

Заранее благодарен!

ответ

1

Как уже упоминалось in the documentation, setRepeating неточна.

С API 19 все повторяющиеся сигналы тревоги неточны. Если ваше приложение нуждается в точном сроке доставки, оно должно использовать одноразовые точные аварийные сигналы, каждый раз, как описано выше, необходимо перепланировать.Унаследованные приложения, чьи targetSdkVersion раньше, чем API 19 будут по-прежнему иметь все их сигналов тревоги, в том числе повторяющихся сигналов, рассматриваются как точное

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

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

+0

И у меня есть вопрос, если у меня есть будильник, который должен повторяться два или три раза в точное время , Например, в '16: 48',' 16: 50' и '16: 52'. Должен ли я добавить три события, вызывающих функцию «setExact»? –

+0

Если вы хотите установить аварийные сигналы в группах по 3, и у них нет определенного шаблона, то я считаю, что вы должны использовать 'setExact' три раза, да. В противном случае, если вы хотите, чтобы будильник срабатывал каждые 2 минуты (например), просто используйте «setExact» один раз и перенести в приемник, как указано выше. – MohanadMohie

+0

Да, они будут иметь определенный узор, например, каждые 2 минуты. Но я не понимаю, что они означают, когда говорят «перепланировать». –

0

Использование setInexactRepeating

alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), 1000 * 60 * 5, alarmIntent); 

И вы можете проверить свой код, что я сделал в моей app.I работал идеально.

pendingIntent = PendingIntent.getBroadcast(this, _id, myIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeToAlarm, AlarmManager.INTERVAL_DAY, pendingIntent); 

Может это поможет ..

+0

Если какой-либо другой запрос, кроме, пожалуйста, сообщите – Kush

+0

Но мне нужно, чтобы будильник был точным в указанное время. И в документации https://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating(int, long, long, android.app.PendingIntent) говорится следующее: 'Расписание повторяющегося сигнала тревоги, который имеет неточные требования времени запуска; например, будильник, который повторяется каждый час, но не обязательно в верхней части каждого часа. « –

+0

Проверьте мой код .. – Kush

Смежные вопросы