Android WorkManager 2.5.0多进程-工作未在指定进程中运行
我正在尝试使用androidx.work:work multiprocess:2.5.0在使用Configuration.setDefaultProcessName()指定的进程中运行work,但是无论我从哪个进程排队,都会在主应用程序进程中调用doWork()方法 正如RemoteWorkManager中所述,它始终与指定的进程保持联系。进程内调度程序也在指定的进程中运行 我的完整测试项目在这里: 我使用以下依赖项:Android WorkManager 2.5.0多进程-工作未在指定进程中运行,android,android-workmanager,multiprocess,Android,Android Workmanager,Multiprocess,我正在尝试使用androidx.work:work multiprocess:2.5.0在使用Configuration.setDefaultProcessName()指定的进程中运行work,但是无论我从哪个进程排队,都会在主应用程序进程中调用doWork()方法 正如RemoteWorkManager中所述,它始终与指定的进程保持联系。进程内调度程序也在指定的进程中运行 我的完整测试项目在这里: 我使用以下依赖项: implementation 'androidx.work:work-run
implementation 'androidx.work:work-runtime-ktx:2.5.0'
implementation 'androidx.work:work-multiprocess:2.5.0'
我删除了清单中的默认WorkManagerInitialiser:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.workmanagertest">
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name="com.example.workmanagertest.SecondProcessBroadcastReceiver"
android:process=":second_process" />
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
</application>
</manifest>
<service
android:name="androidx.work.multiprocess.RemoteWorkManagerService"
tools:replace="android:process"
android:process=":second_process"/>
<service
android:name="androidx.work.impl.background.systemjob.SystemJobService"
tools:replace="android:process"
android:process=":second_process"/>
并使用RemoteWorkManager.getInstance()将我的工作排队:
class SampleWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
override fun doWork(): Result {
Util.d(applicationContext, "SampleWorker.doWork()")
return Result.success()
}
companion object {
@JvmStatic
fun enqueueWork(context: Context) {
Util.d(context,"SampleWorker.enqueueWork()")
try {
val rwm = RemoteWorkManager.getInstance(context)
Util.d(context,"RemoteWorkManager hash ${rwm.hashCode()}")
rwm.enqueueUniqueWork(
"SampleWorker",
ExistingWorkPolicy.REPLACE,
OneTimeWorkRequest.from(SampleWorker::class.java)
)
} catch (ex: Throwable) {
Util.d(context,"SampleWorker, WorkManager is not initialized properly, reason: " + ex.message)
}
}
}
}
我做错了什么?为了在指定的进程中调用doWork()方法,您还需要在清单中为RemoteWorkerManagerService和SystemJobService设置指定的进程名称:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.workmanagertest">
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name="com.example.workmanagertest.SecondProcessBroadcastReceiver"
android:process=":second_process" />
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
</application>
</manifest>
<service
android:name="androidx.work.multiprocess.RemoteWorkManagerService"
tools:replace="android:process"
android:process=":second_process"/>
<service
android:name="androidx.work.impl.background.systemjob.SystemJobService"
tools:replace="android:process"
android:process=":second_process"/>
您可以在此处找到一个工作示例:
此实现基于我从Google问题跟踪程序获得的线索:
是否必须创建应用程序类?我想在多进程android库中实现WorkManager。@Rahul Patidar您可以在Application.onCreate()中调用WorkManager.initialize(这是Configuration.Builder().setDefaultProcessName(processName.build()),而不是实现Configuration.Provider接口。我已经对它进行了测试,效果很好。您可以使用我们库的用户在Application.onCreate()中调用的初始化方法来完成,例如FirebaseApp.initializeApp(),但您仍然必须使用您的库将WorkManager的初始化强加于应用程序。感谢回复@Mateusz Piotrowski,但我担心的是我无法在我的库中创建应用程序类。@Rahul Patidar是的,我理解这一点(我自己开发了一个多进程库,我想留给开发人员一个扩展的选项,例如MultidexApplication)。不必在库中创建应用程序类,您可以创建一个初始化方法,库的用户将在自己的应用程序中调用该方法。onCreate()这就是我给出FirebaseApp.initializeApp()示例的原因。另一个示例是Fabric.with()。或者,您也可以在内容提供商中进行初始化。谢谢。我将投票赞成这个问题/答案。