2013-06-19 6 views
5

Я пытаюсь отправлять уведомления каждый день из своего приложения, используя плагин LocalNotification, который я нашел в github. У меня есть следующий код, который отправляет уведомление, как только приложение запускается.Локальное уведомление повторяется каждый день в PhoneGap Android

var notification = cordova.require("cordova/plugin/localNotification"); 

       document.addEventListener('deviceready', onDeviceReady, false); 

       function onDeviceReady() { 
       alert('device ready'); 
       var id = 0; 
     id++; 
     newDate = new Date(); 
     newDate.setUTCHours(1,30,1); 
      notification.add({ 
       id : id, 
       date : newDate, 
       message : "Your message here", 
       subtitle: "Your subtitle here", 
       ticker : "Ticker text here", 
       repeatDaily : true 
      });     
} 

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

Я сделал свое исследование и выяснил, что другие смогли его достичь, используя плагин LocalNotification.

Я не совсем уверен, как протестировать, так как он требует, чтобы AVD работал на один полный день. Цель очень проста. Мне нужно каждый раз отправлять пользователю одно уведомление, не открывая приложение. Любая помощь будет высоко оценена! Благодаря !!

ответ

4

Я никогда не использовал плагин самостоятельно, но немного копался в коде, показывая, что да, если вы установили repeatDaily в true, ваше уведомление будет там каждый день.

Если вы посмотрите на класс AlarmHelper, вы можете увидеть, что параметр if для этого параметра повторяется каждый день.

final AlarmManager am = getAlarmManager(); 

... 

if (repeatDaily) { 
     am.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, AlarmManager.INTERVAL_DAY, sender); 
    } else { 
     am.set(AlarmManager.RTC_WAKEUP, triggerTime, sender); 
    } 

одна дополнительная деталь объяснена на AlarmReceiver класса является то, что если вы установите время на предыдущий момент времени (например, сейчас 11:00 и установить будильник, чтобы повторить каждый день в 08:00) это будет немедленно выстрелить, а затем на следующий день в назначенное время. Таким образом, у класса есть предложение if, чтобы предотвратить это.

if (currentHour != alarmHour && currentMin != alarmMin) { 
      /* 
      * If you set a repeating alarm at 11:00 in the morning and it 
      * should trigger every morning at 08:00 o'clock, it will 
      * immediately fire. E.g. Android tries to make up for the 
      * 'forgotten' reminder for that day. Therefore we ignore the event 
      * if Android tries to 'catch up'. 
      */ 
      Log.d(LocalNotification.PLUGIN_NAME, "AlarmReceiver, ignoring alarm since it is due"); 
      return; 
     } 

Чтобы установить дату, используйте date параметров. В вашем примере вы используете new Date(), который возвращает по умолчанию текущее время и время, и ваше уведомление будет отображаться ежедневно в одно и то же время. Если вы хотите указать другое время для своего будильника, перейдите в объект даты с нужным временем!

EDIT

Простой способ убедиться, что ваш код работает только один раз использует LocalStorage.

function onDeviceReady(){ 
    ... 
    //note that this will return true if there is anything stored on "isAlarmSet" 
    var isSet = Boolean(window.localStorage.getItem("isAlarmSet")); 
    if (isSet){ 
     //Alarm is not set, so we set it here 
     window.localStorage.setItem("isAlarmSet",1); 
    } 
} 

И просто убедитесь, чтобы очистить переменную, если вы когда-либо снята с охраны ваши тревоги:

localStorage.removeItem("isAlarmSet); 
+0

Спасибо за ответ. Я редактировал свой код в соответствии с вашим предложением. Теперь я закодировал его таким образом, что уведомление повторяется каждое утро в 7 часов утра. Я попробовал это на телефоне моего друга. Он работает впервые, но повторяется в тот же день, когда я открываю приложение. Что может быть причиной этого? – bala

+0

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

+0

Чтобы запланировать его, мне нужно вызвать функцию, следующую за событием ondeviceready. Это то, что я сделал, и это кажется прекрасным. Сегодня в 7 часов утра прозвучал сигнал тревоги. Возможно, проблема, о которой я упоминал ранее, была всего лишь одна вещь. Спасибо чувак !! – bala

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