WorkManager 不重复 PeriodicWorkRequest
WorkManager not repeating the PeriodicWorkRequest
我正在为 运行 我的代码在后台创建一个 android 应用程序。我很清楚 Android Oreo 对后台服务引入的限制,这就是我使用 WorkManager API 来安排任务执行的原因。我正在使用 Android API 24 (Nougat) 在 Mi Max 设备上测试我的代码,并且还手动启用自动启动以便 MIUI 允许应用程序在后台 运行 但问题是,WorkManager 在应用程序第一次启动时触发,但之后,它就不起作用了。下面是我用于定期工作请求和工作本身的代码。
PeriodicWorkRequest 调用:
PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(ClassExtendingWorker.class, 15, TimeUnit.MINUTES)
.setConstraints(Constraints.NONE)
.build();
WorkManager.getInstance().enqueue(work);
ClassExtendingWorker:
public Result doWork() {
/*--- SHOWING NOTIFICATION AS AN EXAMPLE TASK TO BE EXECUTED ---*/
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext(), "")
.setSmallIcon(R.drawable.common_google_signin_btn_icon_light)
.setContentTitle("TestApp")
.setContentText("Code executed")
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
notificationManager.notify(1234, mBuilder.build());
return Result.SUCCESS;
}
将您的 WorkManager 版本更新为 1.0.0-alpha04。
您可以查看发行说明 here
此外,请参考此 PeriodicWorkRequest GitHub demo 并根据您在 DayIncrementViewModel.java
中的要求更新 TimeUnit。它会根据您的需要工作。
WorkManager 仍处于 alpha 模式,因此一旦发布最终版本,它将完全适用于所有设备。
为builder构造函数添加flex interval和flex unit。就我而言,这已经开始起作用了。
PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(ClassExtendingWorker.class, 15, TimeUnit.MINUTES, 5, TimeUnit.MINUTES)
根据文档:
/**
* The minimum interval duration for {@link PeriodicWorkRequest} (in milliseconds).
*/
public static final long MIN_PERIODIC_INTERVAL_MILLIS = 15 * 60 * 1000L; // 15 minutes.
/**
* The minimum flex duration for {@link PeriodicWorkRequest} (in milliseconds).
*/
public static final long MIN_PERIODIC_FLEX_MILLIS = 5 * 60 * 1000L; // 5 minutes.
如果您将这两个值设置为小于指定的最小值,那么您必须等待大约 20 分钟才能看到 log/output
如果您使用间隔小于 15 分钟的 PeriodicWorkRequest,您应该 return Result.retry()
,而不是成功或失败。
我正在为 运行 我的代码在后台创建一个 android 应用程序。我很清楚 Android Oreo 对后台服务引入的限制,这就是我使用 WorkManager API 来安排任务执行的原因。我正在使用 Android API 24 (Nougat) 在 Mi Max 设备上测试我的代码,并且还手动启用自动启动以便 MIUI 允许应用程序在后台 运行 但问题是,WorkManager 在应用程序第一次启动时触发,但之后,它就不起作用了。下面是我用于定期工作请求和工作本身的代码。
PeriodicWorkRequest 调用:
PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(ClassExtendingWorker.class, 15, TimeUnit.MINUTES)
.setConstraints(Constraints.NONE)
.build();
WorkManager.getInstance().enqueue(work);
ClassExtendingWorker:
public Result doWork() {
/*--- SHOWING NOTIFICATION AS AN EXAMPLE TASK TO BE EXECUTED ---*/
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext(), "")
.setSmallIcon(R.drawable.common_google_signin_btn_icon_light)
.setContentTitle("TestApp")
.setContentText("Code executed")
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
notificationManager.notify(1234, mBuilder.build());
return Result.SUCCESS;
}
将您的 WorkManager 版本更新为 1.0.0-alpha04。 您可以查看发行说明 here
此外,请参考此 PeriodicWorkRequest GitHub demo 并根据您在 DayIncrementViewModel.java
中的要求更新 TimeUnit。它会根据您的需要工作。
WorkManager 仍处于 alpha 模式,因此一旦发布最终版本,它将完全适用于所有设备。
为builder构造函数添加flex interval和flex unit。就我而言,这已经开始起作用了。
PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(ClassExtendingWorker.class, 15, TimeUnit.MINUTES, 5, TimeUnit.MINUTES)
根据文档:
/**
* The minimum interval duration for {@link PeriodicWorkRequest} (in milliseconds).
*/
public static final long MIN_PERIODIC_INTERVAL_MILLIS = 15 * 60 * 1000L; // 15 minutes.
/**
* The minimum flex duration for {@link PeriodicWorkRequest} (in milliseconds).
*/
public static final long MIN_PERIODIC_FLEX_MILLIS = 5 * 60 * 1000L; // 5 minutes.
如果您将这两个值设置为小于指定的最小值,那么您必须等待大约 20 分钟才能看到 log/output
如果您使用间隔小于 15 分钟的 PeriodicWorkRequest,您应该 return Result.retry()
,而不是成功或失败。