标签: android-workmanager

Is it possible to use WebView in Worker?

Background

I'm trying to load some URL in the background, but in the same way WebView loads it in an Activity.

There are multiple reasons developers would want it (and requested about it here) , such as running JavaScript without Activity, caching, monitor websites changes, scrapping ...

The problem

It seems that on some devices and Android versions (Pixel 2 with Android P, for example), this works fine on Worker , but on some others (probably on older versions …

android webview android-service android-workmanager

7
推荐指数
1
解决办法
1837
查看次数

NetworkType.UNMETERED 与 NetworkType.METERED - PeriodicWork

在我的应用程序中,我使用工作管理器进行定期工作。我正在将文件上传到服务器。我有一个按钮,单击该按钮会显示一个对话框并询问用户 - 您在上传文件时要使用哪个网络 - 1. Wifi 2. Any

如果用户点击wifi,我每30分钟上传一次文件,如果用户点击Any我每1小时上传一次文件。

以下是我的代码: 1. 如果用户选择 WIFI

PeriodicWorkRequest.Builder wifiWorkBuilder =
                            new PeriodicWorkRequest.Builder(FileUpload.class, 30,
                                    TimeUnit.MINUTES)
                                    .addTag("WIFIJOB1")
                                    .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.UNMETERED).build());
                    wifiWork = wifiWorkBuilder.build();
                    WorkManager.getInstance().enqueueUniquePeriodicWork("wifiJob", ExistingPeriodicWorkPolicy.REPLACE, wifiWork);
Run Code Online (Sandbox Code Playgroud)

如果用户选择任何:

PeriodicWorkRequest.Builder mobileDataWorkBuilder =
                                new PeriodicWorkRequest.Builder(FileUpload.class, 1,
                                        TimeUnit.HOURS)
                                        .addTag("MOBILEDATAJOB1")
                                        .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build());
                        mobileDataWork = mobileDataWorkBuilder.build();
                        WorkManager.getInstance().enqueueUniquePeriodicWork("mobileDataJob", ExistingPeriodicWorkPolicy.REPLACE, mobileDataWork);
Run Code Online (Sandbox Code Playgroud)

对于任何网络,它都能完美运行并每 1 小时上传一次 apk。但是如果用户选择 Wifi 那么这里是问题 -

如果用户连接到其他移动设备的 wifi(比如他正在使用热点),那么这里的网络我想我认为是计量网络,所以它不会上传文件。我只想知道我们的家庭或办公室网络默认情况下是否为未计量网络。如果假设它没有修复(意味着有些是计量的,有些是未计量的),那么如果用户选择 wifi 并且用户 wifi 被认为是计量的,那么使用此代码将永远不会从他的设备文件上传。

或者我应该创建另一个任务,例如:

PeriodicWorkRequest.Builder meteredwifiWorkBuilder =
                            new PeriodicWorkRequest.Builder(FileUpload.class, 45,
                                    TimeUnit.MINUTES)
                                    .addTag("METEREDWIFIJOB")
                                    .setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.METERED).build());
                    wifiWork = wifiWorkBuilder.build();
                    WorkManager.getInstance().enqueueUniquePeriodicWork("meteredwifiJob", ExistingPeriodicWorkPolicy.REPLACE, wifiWork);
Run Code Online (Sandbox Code Playgroud)

因此,如果用户未连接到 wifi 文件将在每 1 …

android android-workmanager

7
推荐指数
1
解决办法
2341
查看次数

Android Oreo workmanager PeriodicWork 不工作

安卓版本:8.1.0

设备:Infinix X604B

工作管理器:1.0.0-alpha11(最新版本)

安排一个 PeriodicWorkRequest 在每 15 分钟后运行一次。工作请求每 15 分钟运行一次,持续大约一小时。然后 PeriodicWorkRequest 停止工作。在 8 小时内,根本没有安排后台工作。我没有杀死我的应用程序,它在后台。

当我将应用程序带回前台时,PeriodicWorkRequest 再次运行后台任务。在我将我的应用程序置于后台后,没有重复的类似经验。

我为我的应用禁用了电池优化。

这是 My Worker 类示例。

class TestWorker extends Worker {
public TestWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
    super(context, params);
}

@NonNull
@Override
public Result doWork() {
    // Adding timestamp of background execution to firestore.
    Map<String, String> value = new TreeMap<>();
    SimpleDateFormat df = new SimpleDateFormat("hh:mm");
    String dateFormat = df.format(Calendar.getInstance().getTime());
    value.put("time", dateFormat);
    FirebaseFirestore.getInstance()
            .collection("my-collection")
            .add(value);
    return Result.SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

}

我是这样称呼它的:

PeriodicWorkRequest.Builder testBuilder …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

7
推荐指数
1
解决办法
3683
查看次数

Android WorkManager 不会触发两个预定的工作人员之一

我的应用程序中安排了两个定期工作人员,其中一个工作人员在 24 小时后重复,另一个在 15 分钟后重复。

最初在全新安装时,事情按预期工作,但几天后我在 2 台设备上遇到了问题(共 5 台)。24 小时工人被正确触发,但 15 分钟工人根本没有被触发。我现在已经监视了 24 小时。

我通过 Stetho 查看了 workmanager 的数据库,看到了一些 24 小时工人的条目和 15 分钟工人的 0 个条目。我在WorkSpec桌子上找。

我通过 Android Studio 进行了调试,在使用 WorkManager 查询之后,getWorkInfosByTag()我得到了 15 分钟工作人员的 80 个对象列表,其中 79 个处于CANCELED状态,一个处于ENQUEUED状态。

很明显,取消的工人没有添加到数据库中?

我没有找到任何来自谷歌的文件来解释工人被取消的情况。

我正在使用1.0.0-beta03工作运行时的版本。此外,我没有杀死应用程序或做任何有趣的事情。该应用程序在后台运行,并没有被杀死。设备为小米 A2 (Android 9)、红米 Note 4(Android 7)。

我需要了解为什么工人被取消了,有没有更好的方法来调试这个?任何指针都会有所帮助和赞成!

谢谢。

Edit1:发布代码以安排两个工作人员。

24小时定期工:

public static synchronized void scheduleWork() {
    checkPreviousWorkerStatus();
    if (isWorking()) {
        Log.i("AppDataCleanupWorker", "Did not schedule data cleanup work; already running."); …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

7
推荐指数
1
解决办法
5916
查看次数

WorkManager setRequiresDeviceIdle 令人困惑

我已经实施了一个预定的工作经理。我的想法是每2小时完成一个过程。但我需要保证执行。根据工作管理器的文档,每个排队的进程都将被保证执行。

但是现在这个setRequiresDeviceIdle让我感到困惑。文档中指出,默认情况下setRequiresDeviceIdle已设置为false。所以我假设如果设备处于空闲模式,我的进程将无法工作。

空闲模式=当手机屏幕关闭一段时间

但是如果我将此setRequiresDeviceIdle设置为true。我假设现在它只会在设备处于空闲模式时工作

即使设备处于空闲状态或未处于空闲状态,我也希望进程完成。我现在该怎么办?

android workmanagers android-workmanager

7
推荐指数
1
解决办法
3043
查看次数

当 onStopped 是 final 时,如何在我的 CoroutineWorker 中执行清理代码?

我升级到 WorkManager 2.1.0 并尝试使用一些 Kotlin 扩展,包括CoroutineWorker. 我的工作人员androidx.work.Worker之前正在扩展,它正在通过覆盖onStopped. 为什么是onStoppedfinal CoroutineWorkerCoroutineWorker停止后我还有其他方法可以执行清理代码吗?

根据这篇博客文章,这应该是一个功能吗?

android-workmanager

7
推荐指数
2
解决办法
1033
查看次数

WorkManager doWork 被解雇两次

我的目标是每小时运行一次简单的任务。在应用程序启动时,我使用ExistingPeriodicWorkPolicy.KEEP标志注册一个独特的定期工作。

这是我的实现:

public class MyWorker extends Worker {

    public MyWorker(Context context, WorkerParameters workerParams) {
        super(context, workerParams);
        // I don't do anyting with workerParams
    }

    public static void enqueueWork() {
        Constraints constraints = new Constraints.Builder()
                .setRequiresBatteryNotLow(true)
                .build();

        PeriodicWorkRequest request = new PeriodicWorkRequest
                .Builder(MyWorker.class, 1, TimeUnit.HOURS)
                .setConstraints(constraints)
                .addTag("MyWorkerWork")
                .build();

        WorkManager.getInstance().enqueueUniquePeriodicWork("MyWorkerWork",
                ExistingPeriodicWorkPolicy.KEEP, request);
    }


    @NonNull
    @Override
    public Result doWork() {
        Log.i(TAG, "doWork");
        return Result.success();
    }
}
Run Code Online (Sandbox Code Playgroud)

我唯一打电话的地方enqueueWork()Application#onCreate

public class MyApplication extends Application {
    @Override
    public void onCreate() …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

7
推荐指数
0
解决办法
716
查看次数

WorkManager 2.3.4 - 新的 lint 规则

我将 WorkManager 的版本增加到 2.3.4,并且有一个新的 lint 规则SpecifyJobSchedulerIdRange,描述为:“当应用程序使用JobService但没有为 WorkManager 指定 jobIds时发出警告。” 和解释:

直接使用 JobScheduler API 时,WorkManager 要求开发人员指定一系列 JobScheduler id,以便 WorkManager 可以安全使用,以免id发生冲突。有关更多信息,请查看 androidx.work.Configuration.Builder.setJobSchedulerJobIdRange(int, int)。

我指定了 WorkManager 可以通过函数 setJobSchedulerJobIdRange 使用的 id 范围,但我仍然收到 lint 警告。奇怪的是,我的自定义 JobService 而不是 Configuration.Builder 收到了 lint 警告。

在我的应用程序类中:

override fun getWorkManagerConfiguration(): Configuration {
    return Configuration.Builder()
       .setWorkerFactory(workerFactory)
       .setJobSchedulerJobIdRange(100000, 101000)
       .build()
}
Run Code Online (Sandbox Code Playgroud)

android lint android-workmanager

7
推荐指数
1
解决办法
714
查看次数

当应用程序在 Android 10 中被杀死时,WorkManager 无法工作,尽管在版本 9(Pie)之前工作正常

当应用程序从 Android 10 中的后台任务被杀死时,我没有通过 workmanager 收到通知时,我发现了这个问题。

它适用于所有 Android 版本,直到 Andorid 9。为了测试这一点,我同时在 9 和 10 版本上运行该应用程序。

其他人也面临这个问题吗?我在网上搜索,但没有针对基于 Andorid 10 的问题的支持解决方案。

注意:一旦打开应用程序并触发工作管理器,我会在 10 中收到通知,但在应用程序完全关闭时不会收到通知。此外,我也在 Google Pixel 设备上针对 Android 10 测试了此场景,但没有成功。

notifications android-workmanager android-10.0

7
推荐指数
1
解决办法
588
查看次数

如果应用程序更新,WorkManager 的队列会被清除吗?

在每次应用程序启动时,我都会使用 ExistingPeriodicWorkPolicy.KEEP 将定期工作排入队列,以便在已有计划的情况下不会对任何其他工作进行排队。

假设在将来的应用程序更新中,我更改了工作的约束或周期,但保留原始的uniqueName. PeriodicWorkRequest由于使用相同,此更改会被忽略吗uniqueWorkName

或者这不会成为问题,因为应用程序更新时,应用程序的所有工作都会被取消?

这里最好的方法是什么?

android android-workmanager

7
推荐指数
2
解决办法
1196
查看次数