【问题标题】:Android WorkManager Periodic task not triggered when app is killed应用程序被杀死时未触发 Android WorkManager 定期任务
【发布时间】:2020-10-28 07:58:38
【问题描述】:

我的目标是每 12 小时更新一次我的应用令牌(使用网络请求),无论应用是在后台还是被杀死,所以我使用 workmanager 来解决这个问题。但是定期任务仅在应用程序处于后台或打开状态时才有效,但当我终止应用程序时,定期任务会停止以更新我的应用程序令牌。

这是我的代码:

WorkManager mWorkManager;
                    mWorkManager = WorkManager.getInstance(context);
                    
                    Constraints constraints = new Constraints.Builder()
                            .setRequiredNetworkType(NetworkType.CONNECTED)
                            .build();


                    PeriodicWorkRequest periodicSyncDataWork =
                            new PeriodicWorkRequest.Builder(AccessTokenUpdateWorker.class, 12, TimeUnit.HOURS)
                                    .addTag("ACCESS_TOKEN_SYNC_DATA")
                                    .setConstraints(constraints)
                                    .setInitialDelay(5, TimeUnit.MINUTES)
                                    // setting a backoff on case the work needs to retry
                                    .setBackoffCriteria(BackoffPolicy.LINEAR, PeriodicWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)
                                    .build();
                    mWorkManager.enqueueUniquePeriodicWork(
                            "ACCESS_TOKEN_SYNC_DATA",
                            ExistingPeriodicWorkPolicy.KEEP, //Existing Periodic Work policy
                            periodicSyncDataWork //work request
                    );

我使用的是 workmanager 2.4.0 版本

【问题讨论】:

  • “当我杀死应用程序时”是什么意思?如果您从 Android Studio 启动应用程序,它的行为与正常启动不同:developer.android.com/studio/known-issues?hl=ro#ki-force-stop 如果您的应用程序被“强制停止”,操作系统会删除所有计划的作业和警报,并且您的周期性工作人员将不会重新安排,直到用户手动打开应用程序。
  • 我的意思是应用程序被从最近的应用程序列表中向右滑动杀死。
  • 您在哪个设备上看到了这种行为?有些设备将从最近的应用列表中删除应用解释为强制停止:dontkillmyapp.com
  • 我正在测试三星 Galaxy M40,但也测试了小米设备,但结果相同。
  • 从最近的应用列表中刷出应用后,您应该可以检查作业是否仍在计划中:developer.android.com/topic/libraries/architecture/workmanager/… 您还可以修改 WorkManager 的默认日志记录:codelabs.developers.google.com/codelabs/… 另外你能在模拟器中检查应用程序的行为吗?

标签: android android-workmanager periodic-task


【解决方案1】:

实际上我的 WorkManager 设置是正确的,但是由于上下文值,Worker 类无法将令牌更新到服务器中。你可以查看我的代码截图。我被分配了错误的上下文,但后来修复了它,现在代码运行完美。

【讨论】:

  • 我已经测试过三星 Galaxy M40 设备和模拟器,它运行良好,但很少有其他设备制造商(如华为/小米)在应用程序被杀时无法运行[从最近的列表中滑动]。任何人都有一个通用的解决方案,适用于所有设备制造商。
【解决方案2】:

我也遇到过同样的问题。我通过在应用程序的系统页面中将“自动启动”设置为“真”和“省电”设置为“无”来解决它。试试这样。

【讨论】:

    【解决方案3】:

    您必须将其作为前台服务启动。

    这里解释了一切: https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#foreground-service-type

    在某些情况下,有必要在清单中声明服务。

    显示AccessTokenUpdateWorker.class代码更清晰。

    【讨论】:

    • AccessTokenUpdateWorker.class 是 Worker 的扩展类。我不认为服务可以提供帮助。应用程序被终止后,服务将被终止。
    • 链接错误,抱歉。您是否检查了日志以了解工作是否以错误结束或只是没有执行?
    • 无法在应用程序被杀死时检查日志,以便在应用程序被杀死时检查任务是否定期运行。该任务会在应用打开或后台时定期运行。
    • 所有工作请求都会在您的应用文件中的数据库中注册。要获取所有人的工作信息,您可以使用 workManager.getWorkInfosByTag("ACCESS_TOKEN_SYNC_DATA");某些工作限制可能不匹配
    • 如果你检查然后我唯一的限制是连接互联网但仍然没有触发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多