WorkManager 2.5.0多进程模式下任务未在指定进程执行问题咨询
配置问题排查与修正方案
核心问题点
未声明调度进程对应的绑定服务
多进程模式下RemoteWorkManager需要绑定到指定调度进程的WorkManagerService才能跨进程通信,当前清单文件缺少该声明,导致绑定失败后自动回退到主进程本地的WorkManager实例执行任务。
需在<application>标签内补充服务声明:<service android:name="androidx.work.impl.WorkManagerService" android:process=":second_process" android:exported="false" />未按进程区分返回Configuration,导致非调度进程意外初始化本地WorkManager
MyApplication会在所有进程启动时执行,当前代码无论当前处于哪个进程都返回指定调度进程的配置,触发主进程本地初始化WorkManager实例,拦截远程调度逻辑。
需修改getWorkManagerConfiguration()方法,先判断当前进程,仅在指定调度进程返回有效配置,非调度进程阻止本地初始化:class MyApplication : Application(), Configuration.Provider { override fun getWorkManagerConfiguration(): Configuration { val currentProcess = getCurrentProcessName() // 仅在指定调度进程返回WorkManager配置 if (currentProcess == "com.example.workmanagertest:second_process") { return Configuration.Builder() .setDefaultProcessName(currentProcess) .build() } // 非调度进程禁止本地初始化WorkManager throw IllegalStateException("WorkManager must not be initialized in non-designated process") } private fun getCurrentProcessName(): String? { val pid = android.os.Process.myPid() val am = getSystemService(ACTIVITY_SERVICE) as ActivityManager return am.runningAppProcesses?.find { it.pid == pid }?.processName } }非调度进程调用不规范
主进程等非调度进程发起任务时,只能直接调用RemoteWorkManager.getInstance(),需排查所有代码(包括间接依赖),确保没有触发任何本地WorkManager.getInstance()的调用,避免本地实例被意外初始化。
内容的提问来源于stack exchange,提问作者Mateusz Piotrowski
相关产品推荐
相关产品推荐

