簡體   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