2017-06-11 8 views
2

興味のあることとエラーシナリオをよく理解するために:JobServiceがあります。 onStartJobに私はtrueを返信して、追加の作業があることをJobManagerに通知します。 Androidのドキュメントには、jobFinishedに電話して、JobManagerにジョブが完了したことを知らせる必要があることが記載されています。JobServiceに対してjobFinishedを呼び出さないとどうなりますか?

今私は不思議です(それに基づいてバグがあるかもしれません)。決してjobFinishedに電話をかけるとどうなりますか? Androidはある時点でジョブサービスを終了しますか? JobServiceの新しいインスタンスが生成されることを許可しますか?それとも、追加のサービスが開始されないようにしますか?共存できるJobServicesの最大数はありますか?

答えて

2

私はjobFinishedを呼び出さないとどうなりますか?

JobServiceは、仕事をしている(またはそれと思われる)限り、ウォークロックを保持しています。 onStartJob()からtrueを返すシナリオでは、ジョブが完了したときにシステムに通知する責任があります。

jobFinished()を呼び出すと、作業が完了したことを示し、JobServiceはwakelockを解放できることを認識します。 jobFinished()に電話をかけると、ウォークロックが解除されず、CPUの排水が継続されます。

Androidはある時点でジョブサービスを停止しますか?

JobServiceはService soのサブクラスです。特定の条件下では、OSはサービスを強制終了します(たとえばメモリ不足)。

JobServiceの新しいインスタンスが生成されることを許可しますか?それとも、追加のサービスが開始されないようにしますか?共存できるJobServicesの最大数はありますか?

  • 手動で作成/ JobServicesをインスタンス化しないでください。
  • JobServiceは一度に1つのジョブしか処理しません。

同じJOBINFO IDを持つ同じJobService のためのあなたschedule()新規雇用した場合、現在のジョブが停止され、新しいものが開始されます。

int schedule (JobInfo job) 

実行するジョブをスケジュールします。 JobInfo内の新しい情報で同じIDを持つ現在スケジュールされているジョブを置き換えます。指定されたIDを持つジョブが現在実行中の場合、ジョブは停止します。


同じJobServiceのためのあなたenqueue()新規雇用した場合、彼らは現在のジョブが完了した後にのみ実行されます。 jobFinished()に電話をかけないと、キュー内の次のジョブは実行されません。

(JOBINFO)スケジュールと同様に
int enqueue (JobInfo job, work) 

、しかし、あなたは、新規または既存のジョブのための作業をキューに入れることができます。同じIDを持つジョブがすでにスケジュールされている場合は、新しいJobInfoに置き換えられますが、以前にエンキューされた作業はそのまま残り、次回の実行時に送出されます。同じIDを持つジョブがすでに実行されている場合は、その新しいジョブがエンキューされます。

同じJobServiceのジョブのキューイングは、schedule()のスケジューリングとは多少異なります。完全なリファレンスについては、its docsを参照してください。