WorkManager在应用程序关闭后停止调度定期工作程序

问题描述 投票:1回答:1

也许这是关于WorkManager的另一个问题,但我确实找不到解决方案...

正如标题所示,我正在尝试每15分钟进行一次定期工作。实际上,在工作人员中,我每分钟都会轮询一些数据。每次轮询之后,几乎每隔1秒钟,我就会检查该工人是否正在停止,如果返回,则继续等待,直到等到1分钟后再次轮询数据。

根据文档,这应该是可行的,实际上是的,直到我从最近的应用程序屏幕上终止了该应用程序为止。

这里是代码:

package com.qsea.app.cordova;

import android.content.Context;

import android.os.SystemClock;

import android.util.Log;

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

public class ServerListenerWorker extends Worker {

    public static final String TAG = "ServerListenerWorker";

    public ServerListenerWorker(
        Context appContext,
        WorkerParameters workerParams
    ) {
        super(appContext, workerParams);
    }

    @Override
    public Result doWork() {

        Log.d(TAG, "Doing work");

        final long startTime = SystemClock.elapsedRealtime();
        final int maxDelta = 840000; // 14 minutes

        while (true) {
            // I did this to stop this worker until 15 minutes
            // and then let the next worker run
            if (SystemClock.elapsedRealtime() - startTime >= maxDelta) {
                break;
            }

            // Here I'm polling data, if the polling results in a failure
            // I return Result.retry()

            // It avoid waiting if it remains only 1 minute until the max time
            if (SystemClock.elapsedRealtime() - startTime >= (maxDelta - 60000)) {
                break;
            }
            for (int i = 0; i < 60; i++) {
                SystemClock.sleep(950);
                // Here it checks if it is stopped
                if (isStopped()) {
                    Log.d(TAG, "Detected stop"); // this is actually never reached
                    break;
                }
            }
        }
        return Result.success();
    }
}

并且我按照以下步骤开始工作

Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(ServerListenerWorker.class, 15, TimeUnit.MINUTES)
    .addTag(serverListenerWorkerUID)
    .setConstraints(constraints)
    .build();
WorkManager.getInstance(cordova.getActivity()).enqueueUniquePeriodicWork(serverListenerWorkerUID, ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);

我通过查看服务器的日志来检查工作程序的正常工作(如果收到请求,则工作正常),直到关闭应用程序为止,它似乎都可以正常工作。然后,它停止运行实际的工作程序,并且再也不运行任何工作程序,直到我重新打开该应用程序为止,该工作似乎已排队,并在应用程序打开后立即恢复。

初始化过程中我做错什么了吗?我的AndroidManifest.xml中也有<service android:name=".ServerListenerWorker" android:permission="android.permission.BIND_JOB_SERVICE" />

这是预期的行为吗?

[我读到中文ROM对后台服务有更多限制,而我有HUAWEI,这似乎是最糟糕的。那会是设备吗?如果是这样,即使在这些设备中,Facebook,WhatsApp,Instagram和其他人也如何管理该功能?

android push-notification android-workmanager background-service
1个回答
0
投票

让我们将其分为两个不同的问题。

  1. 您在工作中正在做的事情很耗电,如果您使用前台服务通知用户您的应用程序在后台连续运行,那就更好了。您还可以将WorkManager与新引入的对长期运行的工人的支持一起使用(幕后使用前台服务)。 More on this in the documentation

  2. 如果特定的OEM有问题,请open an issue on the Android issuetracker,因为这可能是CDD违规。 Google可以联系OEM并要求他们修复ROM。这将需要一些时间,与此同时,您可以查看don't kill my app之类的网站以了解特定设备的限制,并使用autostarter之类的库来帮助用户导航至正确的设置。

顺便说一句,您不需要在AndroidManifest.xml文件中列出您的工作人员

© www.soinside.com 2019 - 2024. All rights reserved.