処理のキャンセルと停止

キューに登録した処理を実行する必要がなくなった場合、処理をキャンセルするよう要求することができます。最も簡単な方法は、id を使用して WorkManager.cancelWorkById(UUID) を呼び出すことによって WorkRequest をキャンセルする方法です。

Kotlin

    WorkManager.cancelWorkById(workRequest.id)
    

Java

    WorkManager.cancelWorkById(workRequest.getId());
    

WorkManager は処理の State の確認を内部で行います。処理がすでに終了している場合は何も行われません。終了していない場合は処理の状態が CANCELLED に変更され、その後は処理が実行されなくなります。処理に依存している WorkRequests の状態もすべて CANCELLED になります。

また、処理の現在の状態が RUNNING の場合、ワーカーは ListenableWorker.onStopped() の呼び出しも受け取ります。このメソッドをオーバーライドして、可能なクリーンアップをすべて処理します。詳細は後述します。

また、WorkManager.cancelAllWorkByTag(String) を使用して、タグで WorkRequest をキャンセルすることもできます。このメソッドは、指定したタグが設定されている処理をすべてキャンセルします。また、WorkManager.cancelUniqueWork(String) を使用して、一意の名前を持つ処理をすべてキャンセルすることもできます。

実行中のワーカーの停止

実行中のワーカーが WorkManager によって停止される理由には、次のようなものがあります。

  • ワーカーをキャンセルするよう明示的に要求した(WorkManager.cancelWorkById(UUID) を呼び出したなど)。
  • 一意処理の場合に、ExistingWorkPolicyREPLACE に設定された新しい WorkRequest を明示的にキューに登録した。古い WorkRequest は直ちに終了済みと判断されます。
  • 処理の制約が満たされていない。
  • システムがアプリに対し、なんらかの理由で処理を停止するよう指示した。これは、実行期限の 10 分を超えた場合に行われることがあります。処理が後で再試行されるようにスケジュール設定されます。

以上のような状況では、ワーカーは ListenableWorker.onStopped() の呼び出しを受け取ります。OS がアプリをシャットダウンする判断を下した場合に備えて、ワーカーをクリーンアップして連帯的に終了する必要があります。たとえば、開いているハンドル、データベース、ファイルなどは、この時点で、あるいはできる限り早い段階で終了する必要があります。また、すでに停止しているかどうかを確認したい場合は、ListenableWorker.isStopped() を呼び出すことができます。onStopped() が呼び出された後に Result を返すことによって処理の完了を通知しても、ワーカーはすでに停止しているとみなされるため、WorkManager はその Result を無視します。

onStopped() の処理方法の例については、WorkManager でのスレッド化をご覧ください。