3

Androidのステータスバー通知を処理するための使いやすいシステムを実装しようとしていますが、次のことを考えていました:

  • いつ、何を表示するかを保存するデータベースを作成する
  • 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システムのネイティブonStopとイベントがディスパッチされないため、これは明らかに機能しません。そのため、停止イベントも発生しません。onDestroy

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 "クラス" と NotificationService.js の完全なソースとその使用法:リンク

4

2 に答える 2

0

私は 1 年遅れてやってきましたが、これは将来他の人を助けることができるかもしれません。

サービスを永久に実行し、サイクルごとにチェックを行う (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);    
    }
};
于 2014-08-02T18:12:00.210 に答える
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'
    });
}
于 2013-08-16T08:11:56.937 に答える