Android 应用程序启动和关闭时的定期工作请求启动和停止

Android Periodic Work Request Start and Stop when the app is starting and closing

当我的应用程序启动时,我使用 WorkManager 创建了一个周期性的工作请求以从服务器获取数据并且它工作正常。我的问题是,我想在我的应用程序关闭时取消工作请求。

如何在我的应用程序关闭时取消工作请求或如何检测应用程序正在关闭?

如果有任何建议,我将不胜感激。

Android Documentation所述。

In Kotlin

WorkManager.cancelWorkById(workRequest.id)

In Java

WorkManager.cancelWorkById(workRequest.getId());

You can also cancel WorkRequests by tag using WorkManager.cancelAllWorkByTag(String). Note that this method cancels all work with this tag. Additionally, you can cancel all work with a unique name using WorkManager.cancelUniqueWork(String).

编辑

要查看应用关闭事件的帮助,请查看 ProcessLifecycleOwner

Kotlin 示例

https://github.com/jshvarts/AppLifecycleDemo

要可以在应用程序关闭时工作,请覆盖 Activity 的 onDestroy() 方法,然后取消当前工作。主要有两类工作

排队工作

如果您不再需要之前排队的工作 运行,您可以要求取消它。最简单的方法是使用其 id 取消单个 WorkRequest 并调用

WorkManager.cancelWorkById(workRequest.getId());

或者您也可以通过 tag 取消工作。

WorkManager.cancelAllWorkByTag(String)

运行工作

您的 运行ning worker 可能被 WorkManager 停止的原因有多种:

  • 您明确要求取消它(例如,通过调用 WorkManager.cancelWorkById(UUID))。
  • 在唯一工作的情况下,您使用 REPLACE 的 ExistingWorkPolicy 明确地将新的 WorkRequest 加入队列。旧的 WorkRequest 立即被视为已终止。
  • 不再满足您的工作限制。
  • 由于某种原因,系统指示您的应用停止您的工作。如果您超过 10 分钟的执行期限,就会发生这种情况。该工作计划稍后重试。

在这种情况下,您的工作人员会接到 ListenableWorker.onStopped() 的电话。

根据您的要求,您明确要求取消(第1点)。 您需要在您的 worker class 中覆盖 onStopped() 并执行清理。

@Override
public void onStopped() {
    super.onStopped();
    //Perform cleanup
}

并且在您的 activity onDestroy() 方法中,通过 idtag 停止工作。

@Override
protected void onDestroy() {
    super.onDestroy();
    WorkManager.cancelWorkById(UUID);
}

希望这会奏效。谢谢