Android Workmanager PeriodicWorkRequest API 只工作一次?

Android Workmanger PeriodicWorkRequest API work only once?

正在使用 androidx 工作管理器 API,在工作管理器中,正在使用 PeriodicWorkRequest 每 4 小时触发一次工作.但它只在 运行 应用程序后工作一次。

PeriodicWorkRequest 编码:-

Constraints constraints = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();

PeriodicWorkRequestpendingCampaignWork = new PeriodicWorkRequest.Builder(PendingCampaignWorker.class, 4, TimeUnit.HOURS)
            .setConstraints(constraints)
            .build();

用于排队请求的工作管理器代码:-

WorkManager.getInstance().enqueueUniquePeriodicWork(LATEST_CAMPAIGN_WORK, ExistingPeriodicWorkPolicy.KEEP, pendingCampaignWork);

为了测试,我将系统时间手动更改为 运行 模拟器中的应用程序触发工作后 4 小时。

我的代码有什么问题吗,帮我解决一下。

更新:-

Work Manager 工作正常,它不像 m.hassan 在回答部分所说的那样基于系统时间工作。我正在测试每 20 分钟触发一次 work,它工作正常。

Work Manager Not 不基于系统时间。您可以提出 15 分钟的定期工作请求。这样你就可以测试你的代码了。

这里有一个例子:

我的定期工作要求:

private static final String TAG = "PeriodicWorkTag";
private static final int PERIODIC_WORK_INTERVAL = 15;

public static void schedulePeriodicWork() {
    androidx.work.PeriodicWorkRequest periodicWorkRequest = new androidx.work.PeriodicWorkRequest.Builder(PeriodicWorkRequest.class, PERIODIC_WORK_INTERVAL,
            TimeUnit.MINUTES)
            .addTag(TAG)
            .build();
    WorkManager.getInstance().enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
}

public static void cancelPeriodicWork() {
    WorkManager.getInstance().cancelAllWorkByTag(TAG);
}

我的工人Class:

public static final String CHANNEL_ID = "VERBOSE_NOTIFICATION" ;
public PeriodicWorkRequest(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
}

@NonNull
@Override
public Result doWork() {
    showNotification(getApplicationContext());
    return Result.SUCCESS;
}

private void showNotification(Context context) {
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("My notification")
            .setContentText("ddd")
            .setStyle(new NotificationCompat.BigTextStyle()
                    .bigText("ddd"))
            .setPriority(NotificationCompat.PRIORITY_DEFAULT);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = "Channel_name";
        String description = "description";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
    notificationManager.notify(100, mBuilder.build());
}

这对我来说很有效:将您的应用添加到 IGNORE_BATTERY_OPTIMIZATIONS 列表。

@SuppressLint("BatteryLife")
    public void showIgnoreBatteryOpt() {
        String packageName = getPackageName();
        Intent intent = new Intent();
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (!pm.isIgnoringBatteryOptimizations(packageName)) {
            Log.d(TAG, "showIgnoreBatteryOpt: NOT ignoring");
            intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + packageName));
            startActivity(intent);
        }
        else {
            Log.d(TAG, "showIgnoreBatteryOpt: ignoring");
        }

    }

添加到AndroidManifest.xml:

    <uses-permission  android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>