繁体   English   中英

Titanium(Android)检查运行服务

[英]Titanium (Android) check for running Services

我正在尝试实现一个方便使用的系统来处理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();
}

这显然不起作用,因为如果服务没有异常终止(如用户强制停止应用程序),则不会调度android系统本机onStoponDestroy事件,因此也不会触发停止事件。

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实例,启动服务来阻止它,因为在应用程序启动时执行此操作,然后退出并重新启动它会导致运行多个服务。

在这一点上,我没有想法,如何检查运行服务。 如果您知道有任何方法可以做到这一点,请告诉我! 谢谢你的任何提示!

编辑

以下是源代码材料,它让我尝试上述方法(也许只有我错误地使用它们):

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

以及我编写的NotificationHandler“class”和NotificationService.js的完整源代码及其用法: link

使用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'
    });
}

我来晚了一年,但也许这可以帮助其他人。

我们有同样的想法:永远运行服务并在每个周期进行检查(我必须检查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);    
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM