2013-03-19 97 views
3

我想实现一个方便易用的系统用于处理状态栏通知Android和我在想如下:钛(安卓)检查运行服务

  • 创建一个数据库,我在哪里存储什么时间以及要显示什么
  • 创建一个服务,使用'interval'服务在后台运行服务,API提供的服务
  • 在该服务中,检查是否需要根据数据库显示任何通知,然后展示下。

唯一的问题是,我无法检测到,如果我需要启动服务或不。我想这些事情,但他们没有运作良好,到目前为止:

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(); 
} 

这显然是行不通的,因为如果服务没有异常终止(如用户强制停止应用程序),则系统本机onStoponDestroy事件将不会被分派,因此停止事件也不会被触发。

2)尝试通过Titanium.Android.getCurrentService()访问任何现役,但我得到一个错误说Titanium.Android没有叫getCurrentService()方法。这很奇怪,因为IDE的代码完成为我提供了这种方法。

3)使用的意图,清除以前运行的服务

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); 

但好像我需要有意向的同一个实例,启动该服务停止,因为这样做在应用程序启动时,然后退出并重新启动会导致运行多个服务。

在这一点上,我跑出了想法,关于如何检查正在运行的服务。请如果你知道任何方式做到这一点,让我知道!感谢任何提示!

编辑

以下是这给了我的想法,尝试上述方法(也许只有我错误地使用它们)源材料:

  1. 本地存储:Titanium.App.Properties
  2. 的访问正在运行的服务的方法:Titanium.Android.getCurrentService
  3. 使用意图停止服务的方法:Titanium.Android.stopService

以及NotificationHandler“class”和NotificationService的完整源代码。JS是我写的,和它们的用法:link

+0

你能解决这个问题吗?我正在与一个非常相似的,即使不是一样的挣扎。 getCurrentService也不会对我做任何事情,我无法将意图/服务保存到应用程序属性等等。非常讨厌和混乱。更糟的是,我发现服务可能会被操作系统所杀,这是一个巨大的痛苦(并且它从不重新启动它)。 – Fygo 2013-08-15 15:28:38

+0

我有关于这个问题的建议..我开始输入,但它太长,所以我张贴为答案..请检查 – Amith 2013-08-16 08:11:51

回答

0

使用Bencoding AlarmManager,它会提供所有你需要安排警报通知:https://github.com/benbahrenburg/benCoding.AlarmManager

该模块提供你所需要的。这非常简单 - 只需在计划Notification or Service时重复设置daily即可。

参考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' 
    }); 
} 
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);  
    } 
};