标签: android-workmanager

Android Workmanger periodicworkRequest API 只能工作一次?

我正在使用androidx工作管理器 API,在工作管理器中我使用PeriodicWorkRequest每 4 小时触发一次工作。但它仅在运行应用程序后有效一次。

定期工作请求编码:-

Constraints constraints = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();

PeriodicWorkRequestpendingCampaignWork = new PeriodicWorkRequest.Builder(PendingCampaignWorker.class, 4, TimeUnit.HOURS)
            .setConstraints(constraints)
            .build();
Run Code Online (Sandbox Code Playgroud)

将请求排队的工作管理器代码:-

WorkManager.getInstance().enqueueUniquePeriodicWork(LATEST_CAMPAIGN_WORK, ExistingPeriodicWorkPolicy.KEEP, pendingCampaignWork);
Run Code Online (Sandbox Code Playgroud)

为了测试,在模拟器中运行应用程序以触发工作后,将系统时间手动更改为 4 小时。

我的代码中是否有任何问题帮助我解决问题。

更新:-

工作管理器工作正常,它不像m.hassan在答案部分中所说的那样基于系统时间工作。我测试每20分钟触发一次工作,工作正常。

android android-jetpack android-workmanager

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

Android 工作管理器:如何每月将作业排入队列一次

遵循这个问题,我研究了 Android 作业调度,如果我想每月做一次某事,工作管理器似乎是最新的工具。我构建了一个 Worker 类,并在我的活动中使用以下代码片段激活它:

PeriodicWorkRequest myWorkRequest =
                new PeriodicWorkRequest.Builder(MonthlyWorker.class, 20, TimeUnit.MINUTES)
                        .build();
WorkManager.getInstance().enqueueUniquePeriodicWork("my fancy test",ExistingPeriodicWorkPolicy.KEEP, myWorkRequest);
Run Code Online (Sandbox Code Playgroud)

虽然我成功测试了 20 分钟时间段,但存在一个问题:没有可用的月份时间单位,只有天数。由于明显的原因,每 30 天执行一次这项工作是行不通的,因为我需要在每个月的第一天执行该任务。所以我该怎么做?我必须使用不同的 API 吗?谢谢。

我可以做类似的事情if (dayOfMonth==1) do Function,但我认为这破坏了调度程序的目的。

android timeunit periodic-task android-workmanager

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

如何确保 WorkManager 取消我的 Worker?

WorkManager 文档中提到取消 Worker 是尽力而为

WorkManager 尽最大努力取消任务,但这本质上是不确定的——当您尝试取消任务时,任务可能已经在运行或已完成

如果我有一个用例,必须Worker调用其中一种取消方法时取消该操作,该怎么办?

android android-architecture-components android-workmanager

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

我们可以使用 WorkManager 在其他 UniqueWork 的队列中添加另一个 UniqueWork

假设我已经使用WorkManager开始了这个 UniqueWork :-

var workContinuation: WorkContinuation = WorkManager.getInstance()
                .beginUniqueWork(AppConstants.FILE_CREATOR_TAG,
                        ExistingWorkPolicy.APPEND,
                        firstOneTimeWorkRequest)
Run Code Online (Sandbox Code Playgroud)

现在,我们的应用程序用户可能想要为其他任务启动另一个 UniqueWork 工作,但该任务应该添加到上述工作任务的队列中。

var workContinuation: WorkContinuation = WorkManager.getInstance()
                    .beginUniqueWork(AppConstants.FILE_DISTRIBUTE_TAG,
                            ExistingWorkPolicy.APPEND,
                            fileDistrubuteTimeWorkRequest)
Run Code Online (Sandbox Code Playgroud)

现在我如何告诉 WorkManager 这个 UniqueWork AppConstants.FILE_DISTRIBUTE_TAG 应该在此 AppConstants.FILE_CREATOR_TAG 的队列中。

我不想使用 Observable 解决方案,在其中我可以跟踪该AppConstants.FILE_CREATOR_TAG工作人员的完成和启动AppConstants.FILE_DISTRIBUTE_TAG

android android-workmanager

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

WorkManager 在异步方法完成之前返回结果

我想在上传之前对媒体文件进行一些编辑,为此我使用了 FFMPEG 库。但是当 FFMPEG 执行带有回调的命令时。因此,即使在 ffmpeg 命令完成之前,WorkManager 也会返回成功。我怎样才能避免它并保持 WorkManager 直到工作完成。我也使用 CountLatch 来添加等待,但是 ffmpeg 不起作用开始工作并且 WorkManager 仍然卡住。任何想法都会受到重视。谢谢

android ffmpeg android-fragments android-workmanager

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

如何在工作管理器中访问房间数据库以定期同步?

我想定期同步 Room 数据库。我正在使用工作管理器来做到这一点。我已经创建了定期工作请求,并且想要发送带有 的表格setInputData(TABLE HERE..)。我想知道我是否做得对。如果正确,我如何定期将表格发送给工作经理?如果错误,请帮我提供合适的解决方案。

这是我的代码:

//schedule recurring task only once
//Fragment
    if(!SessionManager.getBoolenFromPreferences(getActivity(),REFRESH_ATTENDANCE)){
        attendanceViewModel.setupPeriodicRefreshWork();
        SessionManager.putBoolenInPreferences(getActivity(), true, REFRESH_ATTENDANCE);
    }

//view model
public void setupPeriodicRefreshWork() {
    AttendanceScheduler.refreshWork();
}

//Scheduler
public static void refreshWork() {

    //define constraints
    Constraints myConstraints = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();

  //How to Set Data Here ?
    Data source = new Data.Builder()
            .put(HERE)
            .build();

    PeriodicWorkRequest refreshWork =
            new PeriodicWorkRequest.Builder(AttendanceWorker.class, 1, TimeUnit.HOURS)
                    .setConstraints(myConstraints)
                    .setInputData(source)
                    .build();

    WorkManager.getInstance().enqueue(refreshWork);
}
Run Code Online (Sandbox Code Playgroud)

这是我的工人代码:

public class AttendanceWorker extends Worker {

    private Executor executor;
    private static …
Run Code Online (Sandbox Code Playgroud)

android mvvm android-room android-architecture-components android-workmanager

5
推荐指数
0
解决办法
3222
查看次数

FirebaseMessagingService 可以成为生命周期所有者吗?

服务可以扩展LifecycleService哪个implements LifecycleOwner。如何让 FirebaseMessagingService 成为其中之一。即使它只是实现 LifecycleOwner,它会在重写的方法上返回什么getLifecycle()我需要它的背景是,通知启动了WorkManager通过观察谁的工作LiveData

android android-lifecycle firebase-cloud-messaging android-architecture-components android-workmanager

5
推荐指数
0
解决办法
700
查看次数

工人经理的自定义约束

我有一个用例,只有当我的蓝牙设备与我的 Android 应用程序连接时,我的工作人员才应该工作。
我如何在工作管理器中设置自定义约束才能运行我的工作人员类。

示例
仅当连接互联网并且我的 BLE 设备与我的应用程序连接时,我的应用程序才应将我的 BLE 设备数据与服务器同步。

我知道 WorkManager 中提供了互联网约束,但在我的情况下,自定义约束 BLE 设备应该连接,需要在我的场景中进行处理。

android bluetooth-lowenergy android-workmanager

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

排队UniquePeriodicWork 的最佳位置是什么?

我想每天将数据库与服务器数据同步一次,将工作排入队列的最佳位置是什么,因此它每天只运行一次?WorkManager 似乎并不关心下一个入队调用是否在重复间隔内。如果我将排队工作放在 Application 类中,并且该工作已完成,那么如果我关闭并打开应用程序,WorkManager 将再次运行它。

这是否意味着我总是必须在调用之前检查工作是否已排队WorkManager.enqueue()

val workInfo = workManager.getWorkInfosForUniqueWork("UNIQUE_WORK_NAME").get()?.getOrNull(0)
if (workInfo?.state == WorkInfo.State.ENQUEUED) {
    // do nothing
    return
}

workManager.enqueueUniquePeriodicWork(
                "UNIQUE_WORK_NAME",
                ExistingPeriodicWorkPolicy.KEEP,
                PeriodicWorkRequestBuilder<SyncDbWorker>(
                        1,
                        TimeUnit.DAYS
                )
                .setConstraints(constraints)
                .build())
Run Code Online (Sandbox Code Playgroud)

更新:

我忘记提及的一件事是,在我的 Worker 内部我总是返回Result.success()。因此,如果工作由于某种原因失败,WorkManager 将在下一次迭代中重试。

android android-jetpack android-workmanager

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

应用程序关闭/终止时 WorkManager 不运行

我试图使用 WorkManager 每 10 秒运行一个简单的工作。当应用程序在后台或前台运行时,它可以完美运行。当我关闭应用程序(杀死应用程序)时,该工作将不再被调用。

我在创建 MainActivity 时调用以下代码

fun scheduleNotification(context: Context) {
    val workRequest = OneTimeWorkRequest.Builder(NotificationWorker::class.java).setInitialDelay(10000, TimeUnit.MILLISECONDS)
    WorkManager.getInstance().enqueueUniqueWork("NotificationWorker", ExistingWorkPolicy.REPLACE, workRequest.build())
    Log.d("NotificationWorker", "start")
}
Run Code Online (Sandbox Code Playgroud)

工人阶级

class NotificationWorker(context: Context, params: WorkerParameters) : Worker(context, params) {

override fun doWork(): Result {
    Log.d("NotificationWorker", "Working")
    NotificationUtil.scheduleNotification(applicationContext) // n times
    return Result.success()
}
}
Run Code Online (Sandbox Code Playgroud)

当我的应用程序未关闭时,这些代码运行良好。

即使应用程序关闭,我怎样才能让它运行?

android android-wake-lock android-workmanager

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