[英]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.