2017-02-10 3 views
0

私はIntentServiceを持っていて、startCommandがまだ実行されていない場合にのみ呼び出されます。IntentServiceを実行しても一度だけ

これは、このサービスがデータベース内の既存の行をすべて処理しているためです。それは何回か起動するように呼び出すことができますが、すでに実行中の場合は再起動しないようにしてください。処理する行がない場合はIntentServiceに似ていますが、それ自体を閉じる必要があります。

これは達成可能ですか?たぶんPendingIntentFLAG_NO_CREATEで?

IntentServiceの代わりにServiceと別のスレッドでこれを作成できますが、IntentServiceには既にスレッドが実装されています。

答えて

1

多分、PendingIntentとFLAG_NO_CREATEがありますか?

このフラグはサービスではなくPendingIntentの作成を指します。

これは実現可能ですか?カフオフ

ステップ#1:あなたのサービスでは、最初にfalseに設定し(ここではisRunningと呼ばれる)AtomicBooleanフィールドを追加します。

ステップ2:オーバーライドonStartCommand()isRunningfalseの場合は、trueに設定し、super.onStartCommand()にチェーンして、通常のIntentServiceの動作を継承します。 isRunningtrueの場合はsuper.onStartCommand()にチェーンしないでください。

ステップ#3:onHandleIntent()では、あなたがfinallyfalseisRunningを設定try/finallyブロック、中にすべての作業を包みます。

Net:startService()呼び出しは、onHandleIntent()がまだ実行されていない場合にのみ、通常のIntentServiceの処理を行います。

+0

ありがとうございます!ああ、いいよ!トリックは基本クラス 'IntentService'の実装を選択的に呼び出すことです... –

+0

' PendingIntent'は必要ないので、 'startService(intent)'を呼び出すだけでいいですか? –

+1

@DonBox:自分でサービスを開始する場合は、 'startService()'を呼び出します。サービスを開始するために何か他のものが必要なときは 'PendingIntent'を使います(例えば' AlarmManager'、 'Notification')。 – CommonsWare

関連する問題