[英]doWork() method of workmanager is not getting called from alarm manager receiver
我正在使用工作管理器 Onetime Request 来执行任务。 首先,警报管理器以给定的频率被调用,并且从警报管理器接收器类,工作管理器类被调用。 所有代码都运行良好,但突然没有调用工作经理 doWork。 流程将持续到警报管理器接收器,但不会继续进行。
警报管理器接收器类
public class WorkAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String TAG = "WorkAlarmReceiver";
if (BuildConfig.DEBUG) {
Log.i(TAG, "onReceive: intent=" + intent);
}
OneTimeWorkRequest startWork = new OneTimeWorkRequest.Builder(WorkManagerForTools.class).build();
WorkManager.getInstance(context).enqueueUniqueWork("Validate Tool", ExistingWorkPolicy.APPEND_OR_REPLACE , startWork);
}
此接收器在给定的时间间隔内调用正常
//checking if alarm is working with pendingIntent
Intent workIntent = new Intent(mContext,
WorkAlarmReceiver.class)
.setAction(Long.toString(System.currentTimeMillis()
PendingIntent workPendingIntent = PendingIntent.getBroadcast(mContext, 1001,
workIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Log.e(TAG, "New data of pending intent: " + workSpecId + " local work id, " + localWorkId +
" tools id list " + updatedMobileAppToolIds);
if(BuildConfig.DEBUG) {
Log.d(TAG, "New data of pending intent: " + workSpecId + " local work id, " + localWorkId +
" tools id list " + updatedMobileAppToolIds);
}
boolean isWorking = (PendingIntent.getBroadcast(mContext, 1001, workIntent, PendingIntent.FLAG_NO_CREATE) != null);//just changed the flag
if (isWorking) {
alarmManager.cancel(workPendingIntent);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
10 * (minFrequency / 10), workPendingIntent);
} else {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
10 * (minFrequency / 10), workPendingIntent);
}
然后警报管理器接收器类调用 workmanager 类。 这是工作经理类
@SuppressLint("WrongThread")
@NonNull
@Override
public Result doWork() {
// Code to be execute
}
对此表示赞赏的任何帮助。
您可以使用定期工作请求来完成计划任务。 以下是您的操作方法:
定义约束条件,例如设备是否应该连接或是否应该有足够的电池。
现在创建一个带有约束的定期请求,如果需要,定义一个标签名称。 还要设置一个延迟,这将为您的工作开始设置一个初始延迟。
并通过提供唯一的工作名称和 ExistingPeriodicWorkPolicy 创建一个 enqueueUniquePeriodicWork,您可以在此处阅读ExistingPeriodicWorkPolicy 枚举值
默认情况下,定期工作将需要 15 分钟来执行工作请求。
Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).setRequiresBatteryNotLow(true).build(); PeriodicWorkRequest periodicRequest = new PeriodicWorkRequest.Builder(MyWorkerClass.class, 15, TimeUnit.MINUTES) .addTag("myPeriodicRequest") .setConstraints(constraints) .setInitialDelay(5, TimeUnit.MINUTES) .build(); WorkManager.getInstance(context).enqueueUniquePeriodicWork("myPeriodicRequest", ExistingPeriodicWorkPolicy.APPEND_OR_REPLACE, periodicRequest);
您错过了应如何使用 WorkManager 的要点。 您可以使用 AalarmManager 精确,但随后您将执行传递给不精确的东西 - WorkManager。 所以根本没有使用 AlarmManager 的意义。 只需将 WorkManager 直接与定期请求或某些触发器一起使用。 您可以在我比较不同 API 的答案中查看更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.