Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android WorkManager定期任务在应用程序被终止时未触发_Android_Android Workmanager_Periodic Task - Fatal编程技术网

Android WorkManager定期任务在应用程序被终止时未触发

Android WorkManager定期任务在应用程序被终止时未触发,android,android-workmanager,periodic-task,Android,Android Workmanager,Periodic Task,我的目标是每12小时更新一次我的应用令牌(使用网络请求),无论应用程序是在后台还是被杀死,所以我使用workmanager来解决这个问题。但周期性任务仅在应用程序处于后台或打开状态时有效,但当我杀死应用程序时,周期性任务停止以更新我的应用程序令牌 这是我的密码: WorkManager mWorkManager; mWorkManager = WorkManager.getInstance(context);

我的目标是每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版本

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

这里解释了一切:

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


显示
AccessTokenUpdateWorker.class
代码更清晰。

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


我也有同样的问题。我在应用程序的系统页面中将“autostart”设置为“true”,将“节能”设置为“none”,从而解决了这个问题。试试这个。

你说的“当我杀死应用程序时”是什么意思?如果您从Android Studio启动应用程序,它的行为与正常启动不同:如果您的应用程序“强制停止”,操作系统将删除所有计划的作业和警报,在用户手动打开应用程序之前,不会重新安排您的定期工作人员。我的意思是,应用程序被从最近的应用程序列表中向右滑动而终止。您在哪个设备上看到这种行为?有一些设备将从最近的应用程序列表中删除应用程序解释为强制停止:我正在测试三星Galaxy M40,但也测试了小米设备,但结果相同。从最近的应用程序列表中刷出应用程序后,您应该能够检查作业是否仍在计划中:您还可以修改默认的日志记录WorkManager:您还可以在emulator中检查应用程序的行为吗?AccessTokenUpdateWorker.class是Worker的扩展类。我认为服务没什么用。一旦应用程序被终止,服务将被终止。对不起,链接错误。您是否检查了日志以了解工作是否以错误结束,或者它只是没有得到执行?在应用被终止时无法检查日志,以便在应用被终止时检查任务是否定期运行。当应用程序处于打开状态或后台时,任务会定期运行。所有工作请求都会在应用程序文件的数据库中注册。要获取它们的工作信息,可以使用workManager.getWorkInfosByTag(“访问令牌同步数据”);一些工作限制可能不匹配如果你检查,那么我唯一的限制是连接互联网,但仍然没有触发。我已经测试了三星Galaxy M40设备,也测试了模拟器。它工作正常,但很少有其他设备制造商,如华为/小米,在应用程序死机时不工作[从最近的列表中滑动]。任何人都有一个通用的解决方案,可以为所有设备制造商提供服务。