繁体   English   中英

工作管理器的 doWork() 方法没有从警报管理器接收器中调用

[英]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 的答案中查看更多信息。

现代Android中的后台处理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM