我正在尝试实现一个方便使用的系统来处理Android的状态栏通知,我正在考虑以下事项:
唯一的问题是,我无法检测到,是否需要启动服务。我尝试了这些东西,但到目前为止它们都没有运作良好:
1。)如果服务已在本地存储上启动,请保存:
// Do this on application startup
var isRunning = Ti.App.Properties.getBool("service_running", false);
if(!isRunning)
{
var service = Titanium.Android.createService(...);
service.addEventListener('start', function()
{
Ti.App.Properties.setBool("service_running", true);
});
service.addEventListener('stop', function()
{
Ti.App.Properties.setBool("service_running", false);
});
service.start();
}
这显然不起作用,因为如果服务没有异常终止(如用户强制停止应用程序),则不会调度android系统本机onStop
和onDestroy
事件,所以停止事件也不会被解雇。
2。)尝试通过Titanium.Android.getCurrentService()
访问任何有效服务,但我收到一条错误消息,称Titanium.Android没有名为getCurrentService()的方法。这很奇怪,因为IDE代码完成为我提供了这种方法。
3.)使用Intent清除以前运行的服务
var intent = Titanium.Android.createServiceIntent
(
{
url : 'notification/NotificationService.js'
}
);
intent.putExtra('interval', 1000 * 60);
//Stop if needed
Titanium.Android.stopService(intent);
//Then start it
Titanium.Android.startService(intent);
但似乎我需要拥有相同的Intent实例,启动服务来阻止它,因为在应用程序启动时执行此操作,然后退出并重新启动它会导致运行多个服务。
在这一点上,我没有想法,关于如何检查运行服务。如果您知道有任何方法可以做到这一点,请告诉我!谢谢你的任何提示!
修改
以下是源代码材料让我尝试上述方法(可能只是我错误地使用它们):
我写的NotificationHandler“class”和NotificationService.js的完整源代码及其用法:link
答案 0 :(得分:0)
使用Bencoding AlarmManager
,它将提供您安排闹钟通知所需的一切:https://github.com/benbahrenburg/benCoding.AlarmManager
此模块提供您所需的功能。这非常简单 - 只需在安排daily
时将重复设置为Notification or Service
。
请参阅https://gist.github.com/itsamiths/6248106以获取功能完整的代码
我正在检查服务是否已启动,然后显示每日通知或启动服务,然后显示每日通知
var isRunning = Ti.App.Properties.getBool("service_running", false);//get service running bool status
if (isRunning) {
Ti.API.info('service is running');
} else {
Ti.API.info('service is not running');
alarmManager.addAlarmService({
service : 'com.mkamithkumar.whatstoday.DailyEventNotificatoinService',
hour : "08",
repeat : 'daily'
});
}
答案 1 :(得分:0)
我来晚了一年,但也许这可以在将来帮助其他人。
我们有同样的想法:永远运行服务并在每个周期进行检查(我必须检查20种不同的通信)。
我遇到了同样的问题:如何检测服务是否正在运行,不要再次运行以避免重复检查。
要解决这个问题,我所做的就是在每个周期获取当前时间并将其保存到商店。
然后,在启动新服务之前,我检查上次执行的时间是否到位:如果为true,则服务已停止,否则正在运行。
不是很优雅,但是我找到的唯一方法是避免用户杀死应用(和服务)的问题。
这是我的代码"启动器"的服务。在我的情况下,我测试了30秒远:
exports.createAndroidServiceForNotifications = function(seconds) {
var moment = require('alloy/moment');
var diffSeconds = moment().diff(Ti.App.Properties.getString('serviceLastRun', new Date().getTime() - 60000), 'second');
if (diffSeconds > 30) {
var now = new Date().getTime();
var delta = new Date(now + (seconds * 1000));
var deltaMS = delta - now;
var intent = Ti.Android.createServiceIntent({
url : 'notificationsService.js'
});
intent.putExtra('interval', deltaMS);
Ti.Android.startService(intent);
}
};