标签: android-workmanager

Android WorkManager setForegroundInfo

我按照官方指南使用 WorkManager(Kotlin 版本)设置了一个长时间运行的工作线程。现在我需要用操作进度更新通知。文档说:

// 当需要更新 // 正在进行的通知时定期调用 setForegroundInfo()

但是我找不到任何 setForegroundInfo() 方法。那么如何更新正在进行的通知呢?

android android-workmanager

5
推荐指数
1
解决办法
2320
查看次数

使用 KOIN 设置 WorkManager

我正在尝试设置工作管理器来完成一些工作,但在初始化时遇到问题。我正在使用 KOIN workmaanger dsl

implementation "org.koin:koin-androidx-workmanager:2.2.0-rc-4"
Run Code Online (Sandbox Code Playgroud)

我的工人阶级看起来像这样

class NotificationsScheduler(
    private val dispatchers: AppCoroutineDispatchers,
    private val getTaskUseCase: GetTaskUseCase,
    private val context: Context,
    private val workerParameters: WorkerParameters
) : Worker(context, workerParameters) {

    override fun doWork(): Result {
    ...
    }
Run Code Online (Sandbox Code Playgroud)

到目前为止我所做的是禁用默认初始化程序

<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)

我的工作模块是这样设置的

val workerModule = module {
    worker { NotificationsScheduler(get(), get(), get(), get()) }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到 startKoin DSL 中使用的列表中。我还使用 workManagerFactory() DSL 来设置工厂。

startKoin {
        androidContext(this@MyApplication)
        workManagerFactory()
        modules(koinModules)
    }
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当应用程序因异常启动时它会崩溃:

 Caused by: org.koin.core.error.NoBeanDefFoundException: No definition found for class:'androidx.work.WorkerParameters'. Check …
Run Code Online (Sandbox Code Playgroud)

android kotlin koin android-workmanager

5
推荐指数
1
解决办法
4765
查看次数

你能对采用 Hilt 构造函数注入的 Android 工作单元进行单元测试吗

我正在研究 Hilt 在我当前的 Android 应用程序中的使用。

api 'androidx.hilt:hilt-work:1.0.0-alpha02'
implementation "com.google.dagger:hilt-android:2.30.1-alpha"
kapt 'com.google.dagger:hilt-android-compiler:2.30.1-alpha'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'

api "androidx.work:work-runtime:2.4.0"
implementation "androidx.work:work-runtime-ktx:2.4.0"

testImplementation "androidx.work:work-testing:2.4.0"

testImplementation 'com.google.dagger:hilt-android-testing:2.30.1-alpha'
kaptTest 'com.google.dagger:hilt-android-compiler:2.30.1-alpha'

testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.7"
testImplementation "androidx.arch.core:core-testing:2.1.0"
testImplementation "junit:junit:4.13.1"
testImplementation "org.robolectric:robolectric:4.4"
testImplementation 'io.mockk:mockk:1.10.3'
testImplementation "androidx.test:core:1.3.0"
testImplementation "androidx.test.ext:junit:1.1.2"
Run Code Online (Sandbox Code Playgroud)

但我无法让我的androidx.work.CoroutineWorkerUnitTest 运行。

他们失败了,但有一个例外:-

java.lang.IllegalStateException: Could not create an instance of ListenableWorker com.my.manager.background.work.worker.MyWorker

    at androidx.work.testing.TestListenableWorkerBuilder.build(TestListenableWorkerBuilder.java:361)
    at com.my.manager.background.work.ApplicationFeaturesWorkerTest.testApplicationFeaturesWorker(MyWorkerTest.kt:13)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:61)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) …
Run Code Online (Sandbox Code Playgroud)

android junit4 robolectric android-workmanager dagger-hilt

5
推荐指数
1
解决办法
2536
查看次数

使用 android WorkManager 响应 Native HeadlessJs 任务调用

我正在使用 Android WorkManager 创建一个 React Native 后台同步任务。WorkManager 类中的 doWork 方法被定期、正确地调用。我面临的问题是如何从 doWork 方法调用 React Native 函数。在我当前的实现中,未调用 JavaScript 函数。

React Native 中的无头任务

// index.js
AppRegistry.registerHeadlessTask('SyncHeadlessTask', () => SyncHeadlessTask);

// SyncHeadlessTask.js
module.exports = async (taskData) => {
    console.log('task running');
};
Run Code Online (Sandbox Code Playgroud)

我的 Java 中的 HeadlessTask

public class SyncHeadlessTaskService extends HeadlessJsTaskService {
    @Override
    protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            return new HeadlessJsTaskConfig(
                    "SyncHeadlessTask",
                    Arguments.fromBundle(extras),
                    10000, // timeout for the task
                    true // optional: defines whether or …
Run Code Online (Sandbox Code Playgroud)

android react-native android-workmanager

5
推荐指数
1
解决办法
1663
查看次数

Builder.put 只能在同一个库组内调用 (groupId=androidx.work)

当我使用WorkManager并尝试将一些对象传递给它时

Data data = new Data.Builder().put("passstring",object).build();
Run Code Online (Sandbox Code Playgroud)

获取Builder.put 只能从同一个库组 (groupId=androidx.work) 中调用 错误

service android android-service android-workmanager

5
推荐指数
1
解决办法
2252
查看次数

找不到@HiltWorker注释

我想将 WorkManager 与 Hilt 一起使用。我按照文档并将所需的依赖项集成到我的 gradle 文件中:

// WorkManager library
implementation "androidx.work:work-runtime-ktx:$work_version"
// To use WorkManager with Hilt
implementation "androidx.hilt:hilt-work:workmanager_hilt_version"  
// Annotation processor when using Kotlin
kapt "androidx.hilt:hilt-compiler:workmanager_hilt_version"
Run Code Online (Sandbox Code Playgroud)

请注意,版本是work_version = "2.5.0"workmanager_hilt_version = "1.0.0-beta01"

然后我转到我的 Worker 类并按照@HiltWorker文档中的描述输入,但 Android Studio 找不到它:

@HiltWorker
class RefreshDataWorker @AssistedInject constructor(@Assisted appContext: Context, @Assisted params: WorkerParameters): CoroutineWorker(appContext, params) { ...// some doWork() stuff }
Run Code Online (Sandbox Code Playgroud)

@HiltWorker是红色字母,Android Studio 找不到它。为什么 ?做某事。希尔特发生了变化?有没有什么。文档中缺少?

我希望有人能帮帮忙。

android android-workmanager dagger-hilt

5
推荐指数
1
解决办法
1184
查看次数

WorkManager 已触发但返回 Failure 结果

我正在尝试 Android WorkManager,它每 15 分钟就会成功触发一次。

但是,工作尚未完成,我在日志中收到此错误。

I/WM-WorkerWrapper: Worker result FAILURE for Work

在此输入图像描述

这就是我设置Constraints(在应用程序类内部)来触发工作的方式。

 //set-up work
private fun setUpAsteroidLoadingWork() {

    //define work constraints
    val workConstraints =
            Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.UNMETERED)
                    .setRequiresCharging(false)
                    .build()

    //create WorkRequest
    val workRequest = PeriodicWorkRequestBuilder<LoadAsteroidsWorker>(15, TimeUnit.MINUTES)
        .setConstraints(
            workConstraints)
            .build()

    //get WorkManager
    val workManager = WorkManager.getInstance(this)


    //enqueue work
    workManager.enqueueUniquePeriodicWork(
            LoadAsteroidsWorker.WORK_NAME, ExistingPeriodicWorkPolicy.KEEP, workRequest)


}
Run Code Online (Sandbox Code Playgroud)

onCreate()我在应用程序类方法中开始工作

     override fun onCreate() {
        super.onCreate()
        //initialize Timber
        Timber.plant(Timber.DebugTree())
Timber.i("Application's onCreate Called")
        
        //start work inside onCreate
        runWorkInBackground()
    }

    //switch work to run on background
    private …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

5
推荐指数
1
解决办法
3027
查看次数

Hilt 和 WorkManager 错误:lateinit 属性 WorkerFactory 尚未初始化

我正在尝试将 WorkManager 与 Hilt 一起注入。首先我实现文档:

使用类中的 @HiltWorker 注释和 Worker 对象的构造函数中的 @AssistedInject 注入 Worker。您只能在 Worker 对象中使用 @Singleton 或无范围绑定。您还必须使用 @Assisted 注释 Context 和 WorkerParameters 依赖项:

 @HiltWorker
 class RetreiveQuestionWorkManager @AssistedInject constructor(
    @Assisted val appContext : Context,
    @Assisted val workerParameters: WorkerParameters,
    val questionDao: QuestionDao,
    val questionCacheMapper: QuestionCacheMapper)
    : CoroutineWorker(appContext, workerParameters)  {
    ... 
    }
Run Code Online (Sandbox Code Playgroud)

然后我从文档中应用了这个:

然后,让您的 Application 类实现 Configuration.Provider 接口,注入 HiltWorkFactory 的实例,并将其传递到 WorkManager 配置中,如下所示:

@HiltAndroidApp
class MyApp : Application(), Configuration.Provider {

    @Inject lateinit var workerFactory: HiltWorkerFactory

    override fun getWorkManagerConfiguration() =
        Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()

}
Run Code Online (Sandbox Code Playgroud)

最后,我处理文档中的这条注释: …

android kotlin android-workmanager dagger-hilt

5
推荐指数
1
解决办法
2238
查看次数

在Android上定期安排后台任务

我正在开发一个应用程序,我必须从多个传感器读取数据并每 15 分钟将其发送到远程服务器。这也必须在应用程序关闭/终止时完成,并且我还必须确保它始终执行。我还想确保它(几乎)恰好每 15 分钟发生一次(+-1 分钟差异是上限)。

此时,我找到了 3 个选项:使用 Workmanager、Alarmmanager 或使用前台服务。按照文档,Workmanager 似乎是执行后台任务的方法,但是,在阅读了一些内容之后,Alarmmanager 似乎是一个更安全的选择(Workmanager 有时在打瞌睡模式方面存在问题,并且时间不准确,因为它使用了 Flex持续时间至少 5 分钟)。前台服务实际上不允许执行此类任务(它并不是真正长时间运行,它只是一个周期性任务),并且在较新的 Android 版本中受到限制。您认为使用 Alarmmanger 来完成此任务是个好主意,还是应该使用其他东西?谢谢!

android android-alarms android-background android-workmanager

5
推荐指数
1
解决办法
4363
查看次数

workmanager 多次重复 doWork()

这个问题已经以不同的形式被问过很多次了,但我没有得到正确的答案,并且想知道它是否可能不是一个 android bug。

设置 WorkManager 后,会随机调用 doWork(),有时会快速连续调用多达 10 次以上。

  • 它在我的 MainApplication 中仅被调用一次(*参见下文)
  • 如果它被意外调用,我会尝试清除并重新启动它
  • 我已卸载并重新安装该应用程序
  • 我在调用 WorkManager 之前清除所有实例
  • 我尝试使用独特的标签创建它

预期行为是每 10-15 分钟调用一次

请参阅下面的详细信息:使用 Android studio Bumblebee 2021.1.1 Patch 2 在 LG K22 上实现

梯度实现:

implementation 'androidx.work:work-runtime-ktx:2.7.1'
Run Code Online (Sandbox Code Playgroud)

主要活动代码:

    WorkManager.getInstance(this).cancelAllWorkByTag("scanDevices")
    val myMonitorWorkerRequest = PeriodicWorkRequest.Builder(myMonitorWorker::class.java,
        15, TimeUnit.MINUTES,5, TimeUnit.MINUTES).build()

    WorkManager.getInstance(this)
        .enqueueUniquePeriodicWork(
            "scanDevices",
            ExistingPeriodicWorkPolicy.KEEP,
            myMonitorWorkerRequest)
Run Code Online (Sandbox Code Playgroud)
  • 注意:ExistingPeriodicWorkPolicy.REPLACE 不会更改此处的行为

原始工人阶级:

  override fun doWork(): Result {
    try{
        runNotificationService()
        return Result.success()
    }
    catch (e:Exception){
        return Result.failure()
    }
}
Run Code Online (Sandbox Code Playgroud)

当前工人阶级:

  override fun doWork(): Result {
    try{
        val timeNow = System.currentTimeMillis()
        if(timeNow …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

5
推荐指数
1
解决办法
2102
查看次数