每次有互联网时都运行工作者

时间:2019-08-21 03:39:09

标签: java android android-jobscheduler android-workmanager jobservice

我正在开发一个Android应用程序,每次用户打开Wi-Fi或移动数据时,我都使用Firebase JobDispatcher库运行后台作业,但不幸的是,该库已被弃用,现在使用新的WorkerManager去。

我的问题是,每次可用互联网时,如何使用WorkerManager来运行作业?

我已经查看了WorkerManager库迁移指南和文档,但是使用OneTimeWorkRequest或PeriodicWorkRequest无法实现。

这是我与Firebase JobDispatcher库一起使用的代码。

xmlns:app="http://schemas.android.com/apk/res-auto"

3 个答案:

答案 0 :(得分:0)

WorkManager的官方文档包括migration guide,用于将应用程序从Firebase JobDispatcher转换为WorkManager。

关键点在于,WorkManager允许以类似于Firebase JobDispatcher的方式将Constraints设置为您的WorkRequest

Constraints constraints = new Constraints.Builder()
    // The Worker needs Network connectivity
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .build();

PeriodicWorkRequest request =
    // Executes MyWorker every 15 minutes
    new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES)
        // Sets the input data for the ListenableWorker
        .setConstraints(constraints)
        .build();

这会在有连接时每15分钟(最小间隔)执行一次工作。您要考虑的另一个限制是,一个Worker不能运行超过10分钟。在此间隔之后,操作系统将停止您的工作程序。

两个限制都来自Android框架中的底层JobScheduler API。

答案 1 :(得分:-1)

您可以将Constraints设置为WorkRequest,以便仅在网络连接可用时运行。在此处查看示例:WorkManager Basics

答案 2 :(得分:-2)

  

最好一次启动工作管理器并设置“网络类型”作为检查条件,   在Workmanager的doWork()中可用的连接,而不是调用工作管理器   一遍又一遍。

 setConstraints(new Constraints.Builder()
                     .setRequiredNetworkType(NetworkType.CONNECTED)

尝试此解决方案

导入工作经理

https://developer.android.com/jetpack/androidx/releases/work

然后发起Worker

PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(WorkManagerDemo.class, 15, TimeUnit.MINUTES)
            .addTag("WorkManagerDemo").setConstraints(new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();
    WorkManager.getInstance().enqueueUniquePeriodicWork("WorkManagerDemo", ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);

其中WorkManagerDemo类是

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.annotation.NonNull;

import androidx.work.Worker;
import androidx.work.WorkerParameters;

public class WorkManagerDemo extends Worker {

    public WorkManagerDemo(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        //do your work here
        return Result.success();
    }


}