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);
しかし、アプリケーションの起動時にこれを実行し、終了して再起動すると、複数のサービスが実行されるため、サービスを停止するためにサービスを開始したインテントの同じインスタンスが必要なようです。
この時点で、実行中のサービスを確認する方法についてのアイデアが尽きました。これを行う方法を知っている場合は、教えてください!ヒントをありがとう!
編集
上記の方法を試すきっかけとなったソース資料は次のとおりです(おそらく私が間違って使用しているだけかもしれません):
- ローカル ストレージ: Titanium.App.Properties
- 実行中のサービスにアクセスするためのメソッド: Titanium.Android.getCurrentService
- インテントでサービスを停止するメソッド: Titanium.Android.stopService
そして、私が書いた NotificationHandler "クラス" と NotificationService.js の完全なソースとその使用法:リンク