首页 > 解决方案 > 无法从单独的进程启动 WorkManager

问题描述

我正在使用 WorkManager 库(版本:1.0.0-alpha12)。在我的应用程序中,我正在使用 AndroidManifest 中的以下 xml 行创建一个新进程。

android:process=":myprocess"

这就是我使用 WorkManager 的方式:

 public static void startCheckStatusWorker() {
    WorkManager manager = WorkManager.getInstance();
    String uniqueName = "check_status_worker";
    PeriodicWorkRequest.Builder builder = new PeriodicWorkRequest.Builder(CheckStatusWorker.class, 1, TimeUnit.DAYS);
    builder.setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build());
    PeriodicWorkRequest request = builder.build();
    manager.enqueueUniquePeriodicWork(uniqueName, ExistingPeriodicWorkPolicy.KEEP, request);
 }

但是当我从新进程调用这个方法时,应用程序崩溃了。这是抛出的异常,

java.lang.IllegalStateException: WorkManager is not initialized properly.  The most likely cause is that you disabled WorkManagerInitializer in your manifest but forgot to call WorkManager#initialize in your Application#onCreate or a ContentProvider.
at androidx.work.WorkManager.getInstance(WorkManager.java:139)

如果我调用相同的方法,则在正常的应用程序进程中它运行良好,并且我不会按照它的建议在我的应用程序清单中禁用 WorkManagerInitializer。

有没有办法从新进程中获取 WorkManager 实例?

任何建议将不胜感激。谢谢。

标签: androidandroid-jetpackandroid-workmanager

解决方案


如果你真的真的需要服务在一个单独的进程中,你可以在 AndroidManifest 中禁用 WorkManagerInitializer。是这样的:

    <provider
        android:name="androidx.work.impl.WorkManagerInitializer"
        android:authorities="${applicationId}.workmanager-init"
        tools:node="remove"
        android:exported="false" />

(官方文档参考https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration#java

禁用它后,在您的应用程序类中(如果您没有应用程序类,您应该创建自己的并扩展 android 应用程序类),然后调用 WorkManager.initialize()。

那为我修好了。

但请注意,根据谷歌问题论坛(https://issuetracker.google.com/issues/79993883)中的一些答案,工作管理器仍将使用主进程来完成工作(即使它是从第二个过程)。

我推荐什么?如果将服务放在非主进程上没有明显优势,则应该将服务放在主进程上,因为它更难维护(例如,静态全局变量将有两个实例,每个实例一个过程)


推荐阅读