需要在WorkManager中添加上下文信息

12

我正在使用 WorkManager 1.0.0-alpha05 来计划一些任务在我的应用程序运行或未运行的情况下运行。 我将要执行的作业需要 context,那么我如何将上下文传递给它?

class CompressWorker : Worker() {

    override fun doWork(): Result {
        //need context here
        Log.e("alz", "work manager runs")
        return Result.SUCCESS
    }
 }

这是我初始化工作的方法。

val oneTimeWork = OneTimeWorkRequestBuilder<CompressWorker>()
        .setInitialDelay(15, TimeUnit.MINUTES)
        .build()

WorkManager.getInstance().enqueue(oneTimeWork)
2个回答

34

这取决于您需要哪种Context。根据Worker类的文档,您可以直接从Worker类调用getApplicationContext()方法,以获取整个应用程序的Context,在这种情况下应该是合理的。


2
您可以从Worker类的构造函数中获取上下文:https://developer.android.com/reference/androidx/work/Worker.html#Worker(android.content.Context,%20androidx.work.WorkerParameters) - Hassan Jamil
那么,即使应用程序被杀死,WorkManager也可以运行作业,这里返回的是哪个应用程序的上下文? - JohnyTex
当应用程序被杀死时,它不应该工作,但是当应用程序正在运行并且您使用应用程序上下文(例如从应用程序的另一个位置)而不是活动上下文调用WorkManager时,它应该工作。 - Piotr Wittchen

1

Worker类文档中并未提到调用getApplicationContext()是获取Context的首选方式。另一方面,它确切地记录了Worker的公共构造函数将Context作为第一个参数。

public Worker (Context context, 
            WorkerParameters workerParams)

如果你需要在Worker类中使用上下文,请使用它的构造函数中的上下文。

其实是一样的!作为参数传递的上下文是从getApplicationContext()返回的。请参考Worker类的实现! - Binary Baba
如果是这样,那么通过Worker的构造函数传递上下文的目的是什么?看起来目的是让Worker中的逻辑在需要时使用该上下文? - auspicious99
你说得对!Worker对象在内部使用上下文以实现自己的目的。几乎没有任何Android框架/库构造不需要上下文对象! - Binary Baba
1
所以,如果我们正在对Worker进行子类化,使用该上下文对象作为我们的类也是合理的,不是吗? - auspicious99
1
你是对的 @auspicious99,在 worker 类中使用 getApplicationContext() 在某些情况下会抛出异常。最好使用来自 Worker 构造函数的上下文。 - Ashish Lingayat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接