WorkManager解決應(yīng)用退出后繼續(xù)運(yùn)行后臺(tái)任務(wù)
什么是WorkManager
WorkManager是Jetpack中的一個(gè)庫(kù),它擴(kuò)展了JobScheduler的能力, 提供給應(yīng)用在后臺(tái)執(zhí)行任務(wù)的能力。
它能幫助應(yīng)用在滿足條件的時(shí)候執(zhí)行后臺(tái)任務(wù),不管應(yīng)用進(jìn)程是否存活。
一般滿足如下條件的任務(wù)適合使用WorkManager執(zhí)行:
- 即使應(yīng)用被退出,也要保證執(zhí)行的任務(wù)
- 可推遲的任務(wù)
- 定期執(zhí)行的任務(wù)
WorkManager怎么使用
1. 引入相關(guān)庫(kù)
dependencies {
def work_version = "2.8.0"
// (Java only)
implementation "androidx.work:work-runtime:$work_version"
// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"
// optional - RxJava2 support
implementation "androidx.work:work-rxjava2:$work_version"
// optional - GCMNetworkManager support
implementation "androidx.work:work-gcm:$work_version"
// optional - Test helpers
androidTestImplementation "androidx.work:work-testing:$work_version"
// optional - Multiprocess support
implementation "androidx.work:work-multiprocess:$work_version"
}WorkManager庫(kù)目前更新到2.8.0版本,讀者在使用的時(shí)候,可以去WorkManagerAPI參考文檔上找到當(dāng)前的最新版本。
2. 定義一個(gè)Worker
public class UploadWorker extends Worker {
public UploadWorker(@NonNull Context context, @NonNull WorkerParameters params) {
super(context, params);
}
@Override
public Result doWork() {
// Do the work here--in this case, upload the images.
uploadImages();
// Indicate whether the work finished successfully with the Result
return Result.success();
}
}初始化一個(gè)執(zhí)行任務(wù)的UploadWorker,繼承自Worker類(lèi),在doWork中執(zhí)行相應(yīng)的任務(wù)。
doWork的返回結(jié)果:
Result.success(): 工作成功完成Result.failure(): 工作失敗Result.retry(): 工作失敗,應(yīng)根據(jù)重試策略在其他時(shí)間嘗試
3. 創(chuàng)建WorkRequest
創(chuàng)建完Worker之后,你需要告訴系統(tǒng),你的任務(wù)想什么時(shí)候執(zhí)行,按照什么策略執(zhí)行。
1)一次性工作
WorkRequest uploadWorkRequest = new OneTimeWorkRequest.Builder(MyWork.class)
// Additional configuration
.build();- 加急工作
2.7.0之后的版本引入了加急工作的概念,執(zhí)行一些重要的任務(wù)可以設(shè)置加急處理。
OneTimeWorkRequest request = new OneTimeWorkRequestBuilder<T>()
.setInputData(inputData)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
.build();加急處理的worker,在Android12之前通過(guò)前臺(tái)服務(wù)實(shí)現(xiàn),會(huì)在通知欄上顯示通知,所以必須實(shí)現(xiàn)getForegroundInfo方法。
不過(guò)加急任務(wù)并不一定會(huì)立刻執(zhí)行,在某些情況下,可能還是會(huì)延遲啟動(dòng):
- 系統(tǒng)負(fù)載過(guò)高:當(dāng)系統(tǒng)內(nèi)存等資源不足時(shí)
- 超出加急作業(yè)配額限制
3)定期工作
PeriodicWorkRequest saveRequest =
new PeriodicWorkRequest.Builder(SaveImageToFileWorker.class, 1, TimeUnit.HOURS)
// Constraints
.build();4. 創(chuàng)建約束條件
只有滿足約束條件,才會(huì)執(zhí)行任務(wù)。如果在執(zhí)行過(guò)程中,不再滿足某個(gè)約束,WorkManager會(huì)停止工作。
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresCharging(true)
.build();5. 提交WorkRequest
WorkManager
.getInstance(myContext)
.enqueue(uploadWorkRequest);使用enqueue將WorkManager任務(wù)提交給系統(tǒng)。
多進(jìn)程WorkManager
從WorkManager 2.6版本開(kāi)始,支持多進(jìn)程的使用場(chǎng)景??梢栽谝粋€(gè)進(jìn)程中設(shè)置服務(wù),讓服務(wù)在另一個(gè)進(jìn)程中被調(diào)度。
1)設(shè)置WorkRequest
val serviceName = RemoteWorkerService::class.java.name
val componentName = ComponentName(PACKAGE_NAME, serviceName)
val oneTimeWorkRequest = buildOneTimeWorkRemoteWorkRequest(
componentName,
ExampleRemoteCoroutineWorker::class.java
)
workManager?.enqueue(oneTimeWorkRequest)2)在Manifest中定義RemoteWorkService
<service
android:name="androidx.work.multiprocess.RemoteWorkerService"
android:exported="false"
android:process=":worker1" />RemoteWorkerService不需要自己創(chuàng)建,但是需要在Manifest里指定所運(yùn)行的進(jìn)程名。
也可以定義自己的Service,需要繼承自RemoteWorkService。
3)Java繼承RemoteListanableWorker
Java:
public class ExampleRemoteListenableWorker extends RemoteListenableWorker {
private static final String TAG = "ListenableWorker";
public ExampleRemoteListenableWorker(Context appContext, WorkerParameters workerParams) {
super(appContext, workerParams);
}
@Override
public ListenableFuture<Result> startRemoteWork() {
return CallbackToFutureAdapter.getFuture(completer -> {
Log.i(TAG, "Starting ExampleRemoteListenableWorker");
// Do some work here.
return completer.set(Result.success());
});
}
}4) Kotlin繼承RemoteCoroutineWorker
Kotlin:
class ExampleRemoteCoroutineWorker(context: Context, parameters: WorkerParameters) :
RemoteCoroutineWorker(context, parameters) {
override suspend fun doRemoteWork(): Result {
Log.d(TAG, "Starting ExampleRemoteCoroutineWorker")
// Do some work here
return Result.success()
}
companion object {
private const val TAG = "CoroutineWorker"
}
}總結(jié)
本篇文章介紹了WorkManager的使用方法,包括如何在多進(jìn)程中使用WorkManager。
WorkManager使用在后臺(tái)運(yùn)行的任務(wù),即使App掛掉了,也要保證能完成的任務(wù),或者是一些定時(shí)任務(wù)。
本質(zhì)原理也是通過(guò)Service的方法拉起進(jìn)程,執(zhí)行相應(yīng)的doWork中的任務(wù)。
有一點(diǎn)需要注意,如果從后臺(tái)拉起進(jìn)程,因?yàn)檫@個(gè)時(shí)候App運(yùn)行在后臺(tái),能拿到的資源非常少,很容易就會(huì)發(fā)生后臺(tái)ANR。
雖然Service的后臺(tái)ANR不會(huì)彈窗提示用戶,但是會(huì)影響任務(wù)的執(zhí)行成功率。所以,建議使用多進(jìn)程的方式,讓任務(wù)運(yùn)行到子進(jìn)程中。
在多進(jìn)程的情況下,需要在RemoteWorkerService運(yùn)行的進(jìn)程中,修改Application中的onCreate和attachBaseContext方法,定制屬于子進(jìn)程的初始化邏輯。
以上就是WorkManager解決應(yīng)用退出后繼續(xù)運(yùn)行后臺(tái)任務(wù)的詳細(xì)內(nèi)容,更多關(guān)于WorkManager應(yīng)用退出后臺(tái)任務(wù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android開(kāi)發(fā)組件化架構(gòu)設(shè)計(jì)原理到實(shí)戰(zhàn)
這篇文章主要為大家介紹了Android開(kāi)發(fā)組件化架構(gòu)設(shè)計(jì)原理到實(shí)戰(zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android實(shí)現(xiàn)添加商品到購(gòu)物車(chē)動(dòng)畫(huà)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)添加商品到購(gòu)物車(chē)的動(dòng)畫(huà)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android仿360懸浮小球自定義view實(shí)現(xiàn)示例
本篇文章主要介紹了Android仿360懸浮小球自定義view實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
Android項(xiàng)目實(shí)戰(zhàn)之仿網(wǎng)易頂部導(dǎo)航欄效果
這篇文章主要為大家詳細(xì)介紹了Android項(xiàng)目實(shí)戰(zhàn)之仿網(wǎng)易頂部導(dǎo)航欄效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
android設(shè)置adb自帶screenrecord錄屏命令
這篇文章主要介紹了android設(shè)置adb自帶screenrecord錄屏命令,需要的朋友可以參考下2018-11-11
用xutils3.0進(jìn)行下載項(xiàng)目更新
這篇文章主要介紹了用xutils3.0進(jìn)行下載項(xiàng)目更新的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
Android三種方式實(shí)現(xiàn)ProgressBar自定義圓形進(jìn)度條
這篇文章主要介紹了Android三種方式實(shí)現(xiàn)ProgressBar自定義圓形進(jìn)度條的相關(guān)資料,需要的朋友可以參考下2016-03-03
Android 訪問(wèn)文件權(quán)限的四種模式介紹
這篇文章主要介紹了Android 訪問(wèn)文件權(quán)限的四種模式介紹的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06

