PhoneGap Android 中每天重复的本地通知
Posted
技术标签:
【中文标题】PhoneGap Android 中每天重复的本地通知【英文标题】:Local Notification repeated every day in PhoneGap Android 【发布时间】:2013-06-19 18:31:31 【问题描述】:我正在尝试使用我在 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 保持开机一整天。目标很简单。我需要每天向用户发送一个通知,而无需打开应用程序。任何帮助将不胜感激!谢谢!!
【问题讨论】:
【参考方案1】:我自己从未使用过该插件,但稍微深入研究一下代码就会发现,是的,只要您将 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);
【讨论】:
感谢您的回复。我已根据您的建议编辑了我的代码。现在我已经对它进行了编码,使得通知在每天早上 7 点重复。我在朋友的手机上试过。它第一次工作,但每当我打开我的应用程序时都会在同一天重复。这背后的可能原因是什么? 除此之外的可能原因可能是您每次运行应用程序时都在调用代码。你应该只调用一次来设置它,并且永远不会再调用它。 为了安排它,我需要在“ondeviceready”事件之后调用该函数。这就是我所做的,看起来很好。今天早上7点闹钟响了。也许我之前提到的问题只是一件事情。谢谢大佬!! 问题是您在设备就绪状态下设置,但在设备就绪状态下每次打开应用程序时都会运行一次。那不是你想要的。您希望它仅在您第一次打开应用程序时运行! 是的,但我搜索了它但无济于事。很少有人也在 deviceready 回调中实现它。以上是关于PhoneGap Android 中每天重复的本地通知的主要内容,如果未能解决你的问题,请参考以下文章
Android/sencha/phonegap ajax 调用本地 php 文件返回整个代码?
Android 设备上 Phonegap 应用程序的本地存储是不是与内置浏览器分开?