标签: android-workmanager

入队后更改周期性工作请求的重复间隔

有没有简单的方法可以更改重复间隔PeriodicWorkRequest

让我们Worker每 6 小时触发一次并且已经排队,但我需要将其更改为 3 小时。

如果解决方案是取消请求并创建新请求,那么不重复请求的干净方法是什么?

android android-workmanager

4
推荐指数
1
解决办法
1226
查看次数

使用 dagger2 (java) 将类注入到 workmanager 中

问题是我不能用 java 将带有 dagger2 的类注入到工人(WorkManager)中。

我试图在这里理解它的解释:https : //proandroiddev.com/dagger-2-setup-with-workmanager-a-complete-step-by-step-guild-bb9f474bde37 而且我不知道为什么- 但就我而言,这是行不通的。

public class SimpleWorker extends androidx.work.Worker {

private String TAG = "SimpleWorker";

SomeModel someModel; // this is injected model

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

@NonNull
@Override
public Result doWork() {
    Log.d(TAG, someModel.toString()); // but here always null
    return Result.success(); }
}
Run Code Online (Sandbox Code Playgroud)

我希望它运行良好!

是的 - 这是我的问题WorkManager Java Android Dagger2的重复, 但它被版主关闭,我没有时间回答它。我真的想为其他人节省一些时间。附:请 - 不要删除它。

java dagger-2 android-workmanager

4
推荐指数
1
解决办法
1126
查看次数

组合 WorkContinuation 无法按预期工作

我遇到了我无法理解的WorkManager(version ) 行为。2.0.1不幸的是,这种行为会导致我的应用程序出现问题。为了说明我的问题,我将使用一个更简单的例子。

让我们假设有三个Worker实现 - UniqueWorker1UniqueWorker2FinishingWorker

class UniqueWorker1(context: Context, workerParams: WorkerParameters) :
    Worker(context, workerParams) {

    override fun doWork(): Result {
        if (runAttemptCount == 0) {
            Log.d("UniqueWorker1", "First try.")
            return Result.retry()
        }
        Log.d("UniqueWorker1", "Second try")
        return Result.success()
    }
}

class UniqueWorker2(context: Context, workerParams: WorkerParameters) :
    Worker(context, workerParams) {

    override fun doWork(): Result {
        Log.d("UniqueWorker2", "doWork")
        return Result.success()
    }
}

class FinishingWorker(context: Context, workerParams: WorkerParameters) :
    Worker(context, workerParams) {
    override fun …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack android-workmanager

4
推荐指数
1
解决办法
953
查看次数

当客户端调用 WorkManager.initialize() 时,WorkManager 无法在库中工作

我正在编写一个使用 WorkManager 的 Android 库。在代码中的某个地方我称之为这样的:

val uploadTripRequest = OneTimeWorkRequest.Builder(UploadTripWorker::class.java)
    .setConstraints(someConstraints)
    .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, OneTimeWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)
    .build()

WorkManager.getInstance(context)
    .enqueueUniqueWork(WORKER_NAME, ExistingWorkPolicy.REPLACE, uploadTripRequest)
Run Code Online (Sandbox Code Playgroud)

在我的 build.gradle 中我有:implementation 'androidx.work:work-runtime:2.2.0'

通常情况下,一切都很完美。当客户端应用程序调用https://developer.android.com/reference/kotlin/androidx/work/WorkManager.html#initialize时就会出现问题,例如:

WorkManager.initialize(context, Configuration.Builder().setWorkerFactory(myWorkerFactory).build())
Run Code Online (Sandbox Code Playgroud)

当调用此方法时,我的库中的 WorkManager 未按预期工作。doWork方法不在 my 上调用UploadTripWorker,但在 client 提供的工作线程上执行myWorkerFactory

从我的角度来看,它WorkManager在库中不可用,因为它是单例,有人可以通过initialize方法更改其行为。但我希望我错了。

我有什么办法可以解决这个问题吗?当然,我不能告诉我所有的客户不要使用WorkManager.initialize()方法。

android android-workmanager

4
推荐指数
1
解决办法
1121
查看次数

当点击从 WorkManager 发送的通知时,使用导航组件启动特定的 Fragment

我正在根据使用 BroadcastReceiver 启动的Worker的条件向用户发送每日通知。从Worker我只需要context发送通知。

NotificationCompat.Builder(context, CHANNEL_ID).apply {
    setContentTitle(...)
    setContentText(...)
    setContentIntent(pendingIntent(context)) 
}.build()
Run Code Online (Sandbox Code Playgroud)

如何PendingIntent使用导航组件创建启动特定片段?

我试过这个:

fun pendingIntent(context: Context): PendingIntent {
    val navController = NavController(context.applicationContext)
    navController.setGraph(R.navigation.your_navigation)
    return navController.createDeepLink()
        .setDestination(R.id.yourFragment)
        .createPendingIntent()
}
Run Code Online (Sandbox Code Playgroud)

但我得到以下例外:

Caused by: java.lang.RuntimeException: Exception inflating package.name:navigation/your_navigation line 7
        at androidx.navigation.NavInflater.inflate(NavInflater.java:90)
        at androidx.navigation.NavController.setGraph(NavController.java:425)
        at androidx.navigation.NavController.setGraph(NavController.java:407)
        at 
        ......
        at package.name.Worker.doWork(Worker.kt:15)
        at androidx.work.Worker$1.run(Worker.java:85)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
        at java.lang.Thread.run(Thread.java:761) 
Caused by: java.lang.IllegalStateException: Could not find Navigator with name "fragment". You must call NavController.addNavigator() for each navigation type. …
Run Code Online (Sandbox Code Playgroud)

java android kotlin android-architecture-components android-workmanager

4
推荐指数
1
解决办法
2732
查看次数

WorkManager:ResolvableFuture 只能从同一个库组前缀中调用

在我的ListenableWorker课堂上有一段时间我使用了以下内容:

public ListenableFuture<Result> startWork() {
    ResolvableFuture<Result> resolvableFuture = ResolvableFuture.create();
    startSomeAsyncStuff(resolvableFuture);
    return resolvableFuture;
}
Run Code Online (Sandbox Code Playgroud)

基本上,我开始一些异步工作,传入resolvableFuture该函数。异步工作完成后,我对该resolvableFuture对象调用以下内容ListenableWorker

resolvableFuture.set(Result.success());
Run Code Online (Sandbox Code Playgroud)

这运行良好,并且似乎仍然有效,但我现在看到以下 lint 错误消息ResolvableFuture.create()

ResolvableFuture 只能从同一个库组前缀中调用

它仍然可以编译,但是这个警告让我很困扰。现在这样做的正确方法是什么?

android android-workmanager

4
推荐指数
1
解决办法
1160
查看次数

如何使用 Dagger2 在 ViewModel 构造函数中注入 WorkManager 实例?

我想用 Dagger2 注入一个 WorkManager 实例,以便在我的 ViewModel 中使用它,如下所示

class MyViewModel @Inject constructor(workManager: WorkManager) : ViewModel()
Run Code Online (Sandbox Code Playgroud)

当我尝试为 WorkManager 创建一个模块来提供它的实例时,我收到一条错误消息,指出我无法从抽象类提供。如何在我的 ViewModel 构造函数中注入 WorkManager 实例?

android viewmodel dagger dagger-2 android-workmanager

4
推荐指数
1
解决办法
2236
查看次数

从 WorkManager API 级别 29+ 启动 Activity

如果应用程序不符合要求,我们将无法根据新的限制从工作管理器启动活动。我想要的只是从工作管理器启动活动,即使应用程序被终止或在某个特定时间后不再可见。我不想在前台运行该应用程序。无论如何,我可以实现这个目标吗?

任何帮助,将不胜感激。

service policy android kotlin android-workmanager

4
推荐指数
1
解决办法
1698
查看次数

Android API 31 - WorkManager - PendingIntent - 标记 IMMUTABLE 错误

例外:面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

导致异常的代码:WorkManager.getInstance(context).createCancelPendingIntent(id)

build.gradle 选项

编译SdkVersion 31

buildToolsVersion“30.0.3”(版本 31.0.0 出现错误:安装的构建工具修订版 31.0.0 已损坏。使用 SDK 管理器删除并重新安装)。

模拟器:API 31(使用 API S 一切正常)

依赖项

// 工作管理器

实现“androidx.work:work-runtime-ktx:2.7.0-alpha05”

实施 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'

我认为问题可能出在BuildCompat.java的这个方法中:

/**
 * Checks if the device is running on a pre-release version of Android S or a release version of
 * Android S or newer.
 * <p>
 * <strong>Note:</strong> When Android S is finalized for release, this method will …
Run Code Online (Sandbox Code Playgroud)

flags android android-pendingintent android-workmanager

4
推荐指数
1
解决办法
4173
查看次数

WorkManager不重复PeriodicWorkRequest

我正在创建一个Android应用程序以在后台运行我的代码。我很清楚Android Oreo为后台服务引入的限制,这就是为什么我使用WorkManager API安排执行任务的原因。我正在使用Android API 24(Nougat)在Mi Max设备上测试我的代码,并且还手动启用了自动启动,以便MIUI允许该应用程序在后台运行,但是问题是,WorkManager会在应用程序首次启动时触发,在那之后,它不起作用。以下是我用于定期工作请求和工作本身的代码。

PeriodicWorkRequest调用:

PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(ClassExtendingWorker.class, 15, TimeUnit.MINUTES)
            .setConstraints(Constraints.NONE)
            .build();
WorkManager.getInstance().enqueue(work);
Run Code Online (Sandbox Code Playgroud)

ClassExtendingWorker:

public Result doWork() {
    /*--- SHOWING NOTIFICATION AS AN EXAMPLE TASK TO BE EXECUTED ---*/
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext(), "")
            .setSmallIcon(R.drawable.common_google_signin_btn_icon_light)
            .setContentTitle("TestApp")
            .setContentText("Code executed")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT);
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
    notificationManager.notify(1234, mBuilder.build());

    return Result.SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

android miui android-workmanager

3
推荐指数
3
解决办法
7671
查看次数