如果是 Kotlin 使用者,WorkManager 針對 Coroutines 提供一流的支援。如要開始,請在 Gradle 檔案中加入 work-runtime-ktx
。請勿擴充 Worker
,而是延長 CoroutineWorker
,其已暫停 doWork()
的版本。舉例來說,如果您想建構簡單的 CoroutineWorker
來執行某些網路作業,請按照下列指示操作:
class CoroutineDownloadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val data = downloadSynchronously("https://www.google.com")
saveData(data)
return Result.success()
}
}
請注意,CoroutineWorker.doWork()
是「停權」函式,與 Worker
不同,但這些程式碼「不會」在指定的 Configuration
中的 Executor
上執行。預設值為 Dispatchers.Default
。如要提供自訂內容,請提供自己的 CoroutineContext
。在上述範例中,您可能希望在 Dispatchers.IO
上進行這項操作,如下所示:
class CoroutineDownloadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
withContext(Dispatchers.IO) {
val data = downloadSynchronously("https://www.google.com")
saveData(data)
return Result.success()
}
}
}
CoroutineWorker
會藉由取消協作程式來自動處理停止頁面,並傳遞取消信號,藉此自動停止作業。您不需要處理任何特殊處理,就能停止工作。
以其他程序執行 CoroutineWorker
您也可以導入 ListenableWorker
以使用 RemoteCoroutineWorker
,將工作站繫結至特定程序。
RemoteCoroutineWorker
會繫結至特定程序,其中包含兩個額外的引數,並在建立作業要求時做為輸入資料的一部分:ARGUMENT_CLASS_NAME
和 ARGUMENT_PACKAGE_NAME
。
下列範例說明建立與特定程序繫結的作業要求:
Kotlin
val PACKAGE_NAME = "com.example.background.multiprocess" val serviceName = RemoteWorkerService::class.java.name val componentName = ComponentName(PACKAGE_NAME, serviceName) val data: Data = Data.Builder() .putString(ARGUMENT_PACKAGE_NAME, componentName.packageName) .putString(ARGUMENT_CLASS_NAME, componentName.className) .build() return OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker::class.java) .setInputData(data) .build()
Java
String PACKAGE_NAME = "com.example.background.multiprocess"; String serviceName = RemoteWorkerService.class.getName(); ComponentName componentName = new ComponentName(PACKAGE_NAME, serviceName); Data data = new Data.Builder() .putString(ARGUMENT_PACKAGE_NAME, componentName.getPackageName()) .putString(ARGUMENT_CLASS_NAME, componentName.getClassName()) .build(); return new OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker.class) .setInputData(data) .build();
針對每個 RemoteWorkerService
,您必須在 AndroidManifest.xml
檔案中新增服務定義:
<manifest ... > <service android:name="androidx.work.multiprocess.RemoteWorkerService" android:exported="false" android:process=":worker1" /> <service android:name=".RemoteWorkerService2" android:exported="false" android:process=":worker2" /> ... </manifest>