5

我正在尝试使用我在 github 找到的 LocalNotification 插件每天从我的应用程序发送通知。我有以下代码,它会在应用程序启动后立即发送通知。

    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

1 回答 1

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()中,默认情况下会返回当前日期时间,并且您的通知将每天同时显示。如果您想为闹钟指定不同的时间,请传入具有所需时间的日期对象!

编辑

确保代码只运行一次的一种简单方法是使用本地存储。

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);
于 2013-07-01T11:22:46.570 回答