Googleには、JobScheduler
やGcmTaskService
などのジョブ/タスクスケジューリング用の複数のソリューションがあります。それぞれに長所と短所があります。
最近、Googleは「Firebase JobDispatcher」という新しいライブラリを発表しました。
悲しいことに、この新しいAPIについて読むべきものはほとんどありません。実際、それについて何かを見つけるのは本当に難しいです。
私が見つけたのは、彼らの 発表ビデオ と サンプル だけです。しかし、彼らでさえ、このAPIについて知ることはあまりありません。
以前の質問、調査、他のAPI( here など)との比較を見て、新しいAPIがどのように機能するかを尋ね、それを使用するときに考慮すべきことを知りたいと思います。
ジョブにパラメータを保持して、必要に応じて変更することもできますか?サンプルでは、「ユーザー指定の追加のオプションバンドル。デフォルトは空のバンドルです。」ですか?ジョブの実行時にジョブによって変更できますか?
ジョブを簡単に再スケジュールできますか? 「ジョブを繰り返すかどうかを示すブール値」と言われています。スケジュールを変更するタイミングはどのように選択できますか?サンプルを試し、「繰り返し」を選択しましたが、再度実行されることはなく、1回だけ実行されるようです。
ライブラリのジョブに対して保護できますか(一意のIDのため)?
(以前のAPIが行ったように)アプリを更新するとき、特別な注意が必要ですか?アプリの更新後もジョブをスケジュールできますか?サンプルのテストでは、アプリの更新後にジョブが完全になくなっているようです。回避できますか?
デバイスを再起動した場合でもジョブをスケジュールしたい場合、RECEIVE_BOOT_COMPLETED
が必要ですか?サンプルにはそれがあるようです。
スケジュールされたすべてのジョブとその情報(パラメーターを含む)のリストを取得し、それらの特定/すべてをキャンセルしたり、変更することさえできますか?
アプリのデータのクリア操作でジョブが削除されますか?
時間範囲内で実行するのが最適であるとジョブに伝えることは可能ですか(例:午前7時から8時の間)。 「ExecutionWindowTrigger-これは、ジョブを実行する時間枠を指定します」と記載されています。それですか?このウィンドウを見逃した場合はどうなりますか?
onStartJob
クラスのメソッドJobService
はブール値を返し、その説明は「残りの作業があるかどうか」です。" どういう意味ですか? needsReschedule
メソッドのjobFinished
パラメーターはどういう意味ですか?それらは互いに関連していますか?
知っておくべき制限はありますか?たとえば、各関数の最小値と最大値は?
実際にFirebase Android JobDispatcherはAndroidのジョブスケジューリングエンジンを取り巻く抽象化のレイヤーです。現時点では、GCM Network Managerのドライバー実装は1つだけです。つまり、現在と同じように動作します。 GCM Network Managerの動作 。将来的には、より多くのドライバーが実装されることを願っています。
1。ジョブにパラメータを保持して、必要に応じて変更することもできますか?サンプルでは、「ユーザーが提供する追加のオプションバンドル。デフォルトは空のバンドルです」と述べています。 。これでしょうか?ジョブの実行時にジョブによって変更できますか?
Job.Builder
_にはメソッドsetExtras
があり、jobParameters.getExtras()
を介して後でアクセスできる任意のバンドルがあります。バンドルを変更することはできません(jobParameters
にはゲッターのみが含まれます)。フラグsetReplaceCurrent(true)
を使用してジョブのスケジュールを変更し、新しいバンドルを指定できます。2。ジョブを簡単に再スケジュールできますか? 「ジョブを繰り返すかどうかを示すブール値」と呼ばれます。スケジュールを変更するタイミングはどのように選択できますか?サンプルを試し、「繰り返し」を選択しましたが、再度実行されることはなく、1回だけです。
setRecurring(true)
、setTrigger(Trigger.executionWindow(10, 20))
を指定する必要がありますこれは、ウィンドウの開始期限に達するとすぐにトリガーされ、ドライバーはウィンドウの終了前にジョブを実行することをお勧めします。
3。ライブラリのジョブに対して保護できますか(一意のIDのため)?
ジョブタグは、アプリケーション内で一意である必要があります。電話の他のアプリには、独自の「エンドポイント」(パッケージ名/サービス名)があります。 GooglePlayDriver
のすべてのスケジュール済み/終了したジョブを表示するには
_adb Shell dumpsys activity service GcmService
_
4。 (以前のAPIが行ったように)アプリを更新するとき、特別な注意が必要ですか?アプリの更新後もジョブをスケジュールできますか?サンプルのテストでは、アプリの更新後にジョブが完全になくなっているようです。回避できますか?
GooglePlayDriver
は、Google Play開発者サービスまたはアプリが更新された後、ジョブのスケジュールを変更しません。これが 未解決の問題 です。したがって、今のところこれはあなたの責任です。5。デバイスを再起動してもジョブをスケジュールしたい場合、RECEIVE_BOOT_COMPLETEDが必要ですか?サンプルにはそれがあるようです
setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT)
もちろん、独自のドライバーを作成する場合は、自分で寿命を管理する必要があります。6。スケジュールされたすべてのジョブとその情報(パラメーターを含む)のリストを取得し、それらの特定/すべてをキャンセルし、さらに変更することもできますか?
7。アプリのデータのクリア操作でジョブが削除されますか?
8。時間範囲内で実行するのが最適であるとジョブに伝えることは可能ですか(例:午前7:00から8:00まで)。 「ExecutionWindowTrigger-ジョブを実行する時間枠を指定します」と記載されています。それですか?このウィンドウを見逃した場合はどうなりますか?
executionWindow(0, 60*60)
を使用して非定期的なジョブをスケジュールできます。ジョブは7:00-8:00の間に実行されます。windowStart-ジョブが実行に適格と見なされる最も早い時間(秒単位)。ジョブがスケジュールされたとき(新しいジョブの場合)または最後の実行(定期的なジョブの場合)から計算されます。
また、ExecutionWindowTriggerはおおよその時間を指定します。指定されたウィンドウで実行される保証はありません。ウィンドウが表示されない場合、ジョブはいつでも実行されます。
9。 「JobService」クラスのメソッド「onStartJob」はブール値を返し、その説明は「さらに作業が残っているかどうか」です。 。どういう意味ですか? 「jobFinished」メソッドの「needsReschedule」パラメーターの意味は何ですか?それらは互いに関連していますか?
onStartJob
がfalseを返す場合、作業が完了したことを意味します。 jobFinished
を呼び出す必要はありません。 _RESULT_SUCCESS
_は自動的に送信されます。onStartJob
がtrueを返す場合、スレッドを開始して結果を待っていることを意味します。完了したら、jobFinished
を呼び出して、ジョブを再スケジュールするかどうかをGoogle Playサービスに通知する必要があります。はいの場合、ジョブはRetryStrategy
に応じて再スケジュールされます。
10。知っておくべき制限はありますか?たとえば、各関数の最小値と最大値は?
onStartJob
は、できるだけ早く別の実行スレッドに作業をオフロードする必要があります。彼らはあなたから期待されるものの例としてSimpleJobService
を提供します。JobScheduler
用のドライバー実装はありません。また、Google Playサービスが利用できない場合の状況を処理する必要があります。おそらく、Driver
に基づいてAlarmManager
を実装する必要があります。