android - 无法从单独的进程启动 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 实例?
任何建议将不胜感激。谢谢。
解决方案
如果你真的真的需要服务在一个单独的进程中,你可以在 AndroidManifest 中禁用 WorkManagerInitializer。是这样的:
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove"
android:exported="false" />
禁用它后,在您的应用程序类中(如果您没有应用程序类,您应该创建自己的并扩展 android 应用程序类),然后调用 WorkManager.initialize()。
那为我修好了。
但请注意,根据谷歌问题论坛(https://issuetracker.google.com/issues/79993883)中的一些答案,工作管理器仍将使用主进程来完成工作(即使它是从第二个过程)。
我推荐什么?如果将服务放在非主进程上没有明显优势,则应该将服务放在主进程上,因为它更难维护(例如,静态全局变量将有两个实例,每个实例一个过程)
推荐阅读
- php - 移动音频上传返回八位字节/流
- java - 用 asdf 安装 erlang 没有 jinterface
- javascript - 如何在我的个人网站上合并我的播客 RSS 提要?
- android - 片段替换使根布局可见。怎么修?
- javascript - 选择当前选项卡打开的浏览器选项卡
- cmake - 可以在运行/调试配置中使用 CLion 宏吗?
- azure - Azure 应用服务自动缩放不正确的平均 CPU 评估
- shell - 为什么“ls -l”的输出会丢失换行符?
- c++ - 什么是“模板”
结构别名;”在 C++ 中? - html - XPath / XSLT:如何嵌套兄弟姐妹,直到特定兄弟姐妹进入新元素?