2015-04-17 2 views
3

Я пытаюсь воспроизвести рингтон ровно в 7 вечера каждый день, но он воспроизводит рингтон сразу после того, как его ожидающее намерение регистрирует трансляцию.Тревога запускается сразу же после ее создания.

Я назвал обслуживание на переднем плане на кнопку мыши и создан в ожидании умысел там в onStartCommand:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 

    startForeground(FOREGROUND_ID, 
      buildForegroundNotification("DummyApp")); 

    c = Calendar.getInstance(); 
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    int interval = 1000 * 60 * 60*24; 
    c.setTimeInMillis(System.currentTimeMillis()); 
    c.set(Calendar.HOUR, 19); 
    c.set(Calendar.MINUTE,00); 
    manager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), 
      interval, pendingIntent); 
    Intent alarmIntent = new Intent(AlarmService.this, DataProcessor.class); 
    pendingIntent = PendingIntent.getBroadcast(AlarmService.this, 0, 
      alarmIntent, 0); 
    return START_STICKY; 
} 

Сейчас я играю мелодию на прием эту трансляцию в классе DataProcessor в режиме приема метод Процессор данных класс:

@Override 
public void onReceive(Context ctx,Intent intent) { 


    playRIng(ctx); 

} 

но когда я запускаю этот код, нажмите на кнопку, служба создается, но сигнализация срабатывает сразу после AlarmService называется и мелодия играет also.How это возможно потому, что я даю точный 7 O clock time w кто регистрирует трансляцию? Googled много, но нашел тот же код и ничего больше. Каждый код способен воспроизводить мелодию звонка в то время, но также воспроизводит мелодию сразу после регистрации вещания.

+0

Попробуйте эти два ответа http://stackoverflow.com/questions/3358984/why-is-my-android-alarm-manager-firing-instantly http://stackoverflow.com/questions/16201148/why-is-my-alarmmanager-firing-off-instantly –

+0

Потому что вы установили его для ... когда? если текущее время уже прошло, будильник немедленно срабатывает. Попробуйте также установить дату (сегодня или завтра, в зависимости от текущего времени). –

+0

@DerGolem Не могли бы вы объяснить, пожалуйста, –

ответ

0

Вы можете попробовать пример на сайте разработчиков понимания samplecode доступно there.May быть есть некоторые программирования ошибка в коде, но код имеющегося образца там работает точно вы хотите.

Scheduling Repeating Alarms

+0

Огромное спасибо @ Anarkali.You спас меня. Способ, которым я написал код для тревоги, не был правильным. Используя это, я исправил свои ошибки, и теперь он отлично работает. El_Mochiq Ваше состояние было истинным и подходящим для того, чтобы сделать огонь тревоги точно в 19.Thankyou также. :) –

2

Почему вы не используете состояние ?:

@Override 
public void onReceive(Context ctx,Intent intent) { 
Calendar c = Calendar.getInstance(); 
int hour = c.get(Calendar.HOUR); 

if(hour==19) 
{ 
    playRIng(ctx); 
} 

} 
+0

Я думаю, что это может сработать. Позвольте мне попробовать запустить это. Спасибо за этот ответ. :) –

+0

@AndhadhundhPitaii это сработало? – Aiapaec

+0

Да Это сработало, спасибо. –

1

Если вы запускали этот код в 9 вечера вы будете говорить AlarmManager, что цель должна была бежать в первый раз 2 часа назад.

Вам нужно проверить, находится ли время календаря за текущее время.
Если вам нужно добавить день в календарь, чтобы он сначала запускал завтра в 7 вечера.

Нечто подобное может работать:

c = Calendar.getInstance(); 
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    int interval = 1000 * 60 * 60 * 24; 
    // Not needed 
    // c.setTimeInMillis(System.currentTimeMillis()); 
    c.set(Calendar.HOUR, 19); 
    c.set(Calendar.MINUTE, 00); 

    // ** Add this ** 
    // Check if the Calendar 7pm is in the past 
    if (c.getTimeInMillis() < System.currentTimeMillis()) 
     c.add(Calendar.DAY_OF_YEAR, 1); // It is so tell it to run tomorrow instead 

    manager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), interval, pendingIntent); 
    Intent alarmIntent = new Intent(AlarmService.this, DataProcessor.class); 
    pendingIntent = PendingIntent.getBroadcast(AlarmService.this, 0, alarmIntent, 0); 
+0

c.setTimeInMillis (System.currentTimeMillis()); Зачем нужна эта строка? Не задает ли время c текущее время? –

+0

Простое вызов Calendar.getInstance() даст вам текущее время. Нет необходимости устанавливать его с помощью setTimeInMillis(). Проблема с вашим кодом заключается в том, что вы можете сообщить AlarmManager, что сигнал тревоги должен был быть запущен в прошлом, так что это происходит, как только вы его установили. – Mike

0

Лучший способ, играть с час & mintue.

Примечание: Пожалуйста, проверьте свое время. В моем случае это 24 часа в сутки формиат

Пример:

 Calendar c = Calendar.getInstance(); 
    //for 12 hr formate user int hour = c.get(Calendar.HOUR); 
    int hour = c.get(Calendar.HOUR_OF_DAY); 
    int minute = c.get(Calendar.MINUTE); 
    //Log.e("time",""+hour+":"+minute); 

    if (hour == 10 && minute == 0) { 

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