标签: android-workmanager

当应用程序被用户杀死时,工作管理器不工作。为什么?

我想执行一项任务,即使在使用工作管理器终止应用程序之后也是如此。但是,在应用程序被杀死后不会执行任务。

    workManager = WorkManager.getInstance();
    Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
    OneTimeWorkRequest saveData = new OneTimeWorkRequest.Builder(SaveDataWorker.class).setConstraints(constraints).setInitialDelay(10,TimeUnit.SECONDS).build();
    workManager.enqueue(saveData);
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

12
推荐指数
1
解决办法
9246
查看次数

如何让 Flutter Workmanager 插件和 Location 插件一起工作

一、问题描述

我的目标是构建一个 Flutter 应用程序,该应用程序使用此工作管理器插件并使用此位置插件获取定期位置更新。但是当我的 Workmanager 回调触发时,我无法正确加载位置插件。我收到此错误:

MissingPluginException(No implementation found for method getLocation on channel lyokone/location)
Run Code Online (Sandbox Code Playgroud)

所以基本上,问题在于当 Workmanager 插件尝试运行 dart 代码时,它不会加载 Location 插件。

2.我研究过的其他资源

我发现其他人也面临同样的问题,这里这里这里

据我了解,为这些问题提供的解决方案归结为:创建一个名为CustomApplication.java的文件,它扩展FlutterApplication并注册您的插件。然后在 AndoidManifest.xml 文件中注册 CustomApplication.java 文件。

3. 到目前为止我的代码

我试图制作一个实现我需要的功能的最低限度的应用程序:

  1. 我实现了 Workmanager 插件(工作正常)
  2. 我实现了位置插件(工作正常)
  3. 我试图结合这些功能(不起作用)

要准确了解我在每个步骤中所做的工作,请查看此处:https : //gitlab.com/tomoerlemans/workmanager_with_location/-/commits/master。(此存储库还可用于快速复制问题)。

相关代码文件如下:

main.dart

import 'package:flutter/material.dart';
import 'package:workmanager/workmanager.dart';
import 'package:location/location.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Workmanager.initialize(callbackDispatcher, isInDebugMode: true);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget …
Run Code Online (Sandbox Code Playgroud)

android dart flutter flutter-dependencies android-workmanager

12
推荐指数
2
解决办法
8154
查看次数

Android workmanager计划的工作人员在任务被杀后丢失

我正在尝试使用新的WorkManager API 1.0.0-alpha06每15分钟运行一次工作.如果我没有错,使用带有PeriodicWorkRequest的工作管理器应该让工作人员彻底查看任务并重新启动电话,但是当我从最近的应用程序中滑动任务时,预定的工作人员会丢失(我等了大约45分钟才看到任何人工人的日志安排15分钟间隔).

这些是我的文件:

MyExampleWorker.java:

public class MyExampleWorker extends Worker{
    public static final String TAG = "MY_EXAMPLE_WORKER";

    @NonNull
    @Override
    public Result doWork() { 
        Log.i(TAG, "Starting background worker");
        // Getting configuration data
        long param1 = getInputData().getLong("param1", 60000);
        String param2 = getInputData().getString("param2");
        String param3 = getInputData().getString("param3");

        PackageManager pckMgr = mContext.getPackageManager();
        ...
        ..
        .
        return Result.SUCCESS;
    }

}
Run Code Online (Sandbox Code Playgroud)

Main.java:一旦应用程序启动,此方法就会触发

@ReactMethod
public void execute() {
    Log.i(TAG, "inside execute, setting up periodic worker in workManager");

    Data inputData = new Data.Builder()
            .putLong("param1", 60000)
            .putString("param2", "something")
            .putString("param3", …
Run Code Online (Sandbox Code Playgroud)

android android-service android-architecture-components android-jetpack android-workmanager

11
推荐指数
1
解决办法
2111
查看次数

Android WorkManager:无法从 PeriodicWorkRequest 获取输出数据

由于某些原因,我无法从 Android WorkManager 的 PeriodicWorkRequest 获取输出数据。工作人员按预期定期运行,只是不返回任何数据。

我的主要活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    schedulePeriodicRequests();
}

public void schedulePeriodicRequests() {
    PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(ServerRequestsWorker.class, 15, TimeUnit.MINUTES)
            .build();

    WorkManager workManager = WorkManager.getInstance(MainActivity.this);
    workManager.enqueue(workRequest);
    workManager.getWorkInfoByIdLiveData(workRequest.getId())
            .observe(this, new Observer<WorkInfo>() {
                @Override
                public void onChanged(@Nullable WorkInfo workInfo) {
                    if (workInfo != null) {
                        Log.d(LOG_TAG, "WorkInfo received: state: " + workInfo.getState());
                        String message = workInfo.getOutputData().getString(ServerRequestsWorker.KEY_MESSAGE);
                        Log.d(LOG_TAG, "message: " + message);
                    }
                }
            });
}
Run Code Online (Sandbox Code Playgroud)

我的 ServerRequestsWorker:

public static final String KEY_MESSAGE = "message"; …
Run Code Online (Sandbox Code Playgroud)

java android android-workmanager

11
推荐指数
2
解决办法
4685
查看次数

在android中连接wifi时如何触发工作管理器?

我有应用程序需要在设备上连接互联网后立即同步数据。

我在 Worker 类中有同步工作,它工作正常。但是我需要在手机连接互联网后立即运行这个类。由于不推荐和弃用广播接收器的连接更改,我需要一种方法在连接互联网时启动我的课程,以便数据同步。我怎样才能做到这一点?

我还想在用户存在应用程序并保持 Internet 连接状态时安排工作管理器,但是当应用程序从最近关闭时,不会调用 onDestroy。你有什么解决方案或逻辑吗?

android broadcastreceiver android-jobscheduler android-workmanager

11
推荐指数
2
解决办法
5966
查看次数

前台服务与 WorkManager 进行位置跟踪

假设我想构建一个应用程序,它定期请求当前位置(例如,每 10 分钟一次,这个数字应该是可配置的)并提交到服务器。

我知道对于这种情况通常建议使用 Foreground Service 和 WorkManager。然而哪个更适合呢?以下是我的想法和疑问。

  1. WorkManager - 主要用于可延迟的后台工作,其执行是有保证的。但我知道从 Android 8 (API 26) 开始引入了后台位置,并且限制位置每小时只能更新几次https://developer.android.com/about/versions/oreo/background-location-limits。因此,这可能不符合定期更新的要求。

  2. ForegroundService - 非常适合运行并需要让用户意识到的东西。出于隐私目的,建议这种情况(位置跟踪)使用。Google 还创建了一个示例应用程序来推广这种做法https://github.com/android/location-samples/tree/master/LocationUpdatesForegroundService

从上面的分析来看,似乎ForegroundService是这样的。但是我还发现它WorkManager具有内置支持,可ForegroundService通过androidx.work.impl.foreground.SystemForegroundService https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running-kotlin结合使用 Worker

这让我很困惑,不知道我应该使用什么,以及谷歌针对这个特定场景真正推荐的是什么。

有人有什么想法吗?

android android-location foreground-service android-architecture-components android-workmanager

11
推荐指数
1
解决办法
5610
查看次数

ClassNotFoundException:“androidx.work.impl.WorkManagerInitializer”

Google AdMob Ads 库版本 19.4.0 升级到 19.5.0 后,部分设备上出现了新的异常:

Caused by java.lang.ClassNotFoundException 
Didn't find class "androidx.work.impl.WorkManagerInitializer" on path: ...
dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:196)
androidx.core.app.CoreComponentFactory.instantiateProvider (CoreComponentFactory.java)
android.app.ActivityThread.installProvider (ActivityThread.java:7213)
android.app.ActivityThread.installContentProviders (ActivityThread.java:6769)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:941)
Run Code Online (Sandbox Code Playgroud)

该异常出现在 Android 8 和 10 的设备上。

AdMob 库 19.5.0 添加了对 WorkManager 2.1.0 的依赖项(通过 Play Services Ads Lite 库): https://mvnrepository.com/artifact/com.google.android.gms/play-services-ads-lite/19.5.0

在这个问题上有一个类似的问题,但它似乎是无关的(较旧的Android操作系统版本具有多个dex,而这里是单个dex和较新的操作系统版本)。

目前我降级到 AdMob 19.4.0,其中不包含 WorkManager 依赖项。

更新(2020.12.18)

  • 异常频率为每 1000 台运行 Android 10 的设备 1 次。
  • 强制使用 WorkManager 2.4.0(而不是 2.1.0)也会生成异常。
  • 该问题与 AdMob 无关。使用 AdMob 19.4.0 将 WorkManager 添加到项目中重现了该问题。
  • 我目前的假设是,该问题是由 AudienceNetwork 和 WorkManager …

android admob facebook-audience-network android-workmanager

11
推荐指数
2
解决办法
7549
查看次数

使用WorkManager定期每日工作请求

如何正确使用WorkManagerAndroid Jetpack中的新功能来安排每天一次的定期工作,这应该每天做一次并且只做一次?

我们的想法是检查具有给定标签的工作是否已经存在WorkManager,否则开始新的定期工作.

我尝试使用下一种方法来做到这一点:

public static final String CALL_INFO_WORKER = "Call worker";

...

WorkManager workManager = WorkManager.getInstance();
List<WorkStatus> value = workManager.getStatusesByTag(CALL_INFO_WORKER).getValue();
if (value == null) {
    WorkRequest callDataRequest = new PeriodicWorkRequest.Builder(CallInfoWorker.class,
                24, TimeUnit.HOURS, 3, TimeUnit.HOURS)
                .addTag(CALL_INFO_WORKER)
                .build();
    workManager.enqueue(callDataRequest);
}
Run Code Online (Sandbox Code Playgroud)

value总是空,即使我把一个断点里面WorkerdoWork()方法(所以它肯定是正在进行中),并从另一个线程检查工作状态.

android android-architecture-components android-jetpack android-workmanager

10
推荐指数
2
解决办法
8472
查看次数

WorkerManager是一种在应用程序中实现警报/提醒功能的可行方法吗?

我们注意到AlarmManagerCompat,由于AlarmManager不同版本的操作系统中的行为不同,仅在我们的应用程序中实现警报/提醒功能并不是一种可靠的方法.(例如,打盹模式)

最初,我们计划使用Evernote的android-job库来帮助我们在应用程序中实现警报/提醒功能.

但是,在此过程中,我们也注意到谷歌刚刚发布WorkerManager.

到目前为止,WorkerManager当我们在应用程序退出后运行一些一次性后台作业(几乎是即时的,具有互联网连接约束)时,对我们来说效果很好.

我们计划使用WorkerManager实现警报/提醒功能.

我想知道,WorkerManager实现这样的功能有多可靠?有人尝试过吗?我们的目标是API 15及更高版本.

android android-architecture-components android-workmanager

10
推荐指数
1
解决办法
1714
查看次数

将初始延迟设置为Android中的Periodic Work Manager

我有一个Worker需要每24小时运行一次的实例,考虑到PeriodicWorkRequestAPI ,这很简单.但这是抓住了.

如果用户在下午8点开始工作,我需要工作管理器的第一个实例在第二天早上9点运行,然后遵循24小时定期约束.

我看了一下这里,我发现OneTimeWorkRequest API有一个setInitialDelay()可以使用的功能,但我无法找到任何PeriodicWorkAPI.

这是一些hacks,例如我可以使用OneTimeWork初始延迟,然后PeriodicWork从那里安排一个但是它有点肮脏的黑客.

有没有办法只用PeriodicWorkRequestAPI 来做到这一点?

android kotlin android-workmanager

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