作用:1,確保重要的後臺任務一定會執行
比如下載的時候手機沒電了,這種情況下workManager已經做了處理
2,省電
添加依賴
//workmanager
implementation "android.arch.work:work-runtime:1.0.0-alpha06"
第一,先看一個簡單的例子
package com.example.workmanagertest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.work.Data;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
import androidx.work.WorkStatus;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
//單次執行,worker只執行一次
OneTimeWorkRequest request;
public static final String WORKERKEY = "zhang_xin";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在Activity開啓任務,可以傳入數據到任務
Data data = new Data.Builder().putString(WORKERKEY,"張欣愛王學崗一生一世").build();
//初始化OneTimeWorkRequest
request = new OneTimeWorkRequest.Builder(MainWork.class).setInputData(data).build();
//把任務加入到任務隊列中,並在滿足某種條件的情況下執行
WorkManager.getInstance().enqueue(request);
//接收任務中回來的數據
//任務很多,根據ID判斷是哪個任務回傳的數據
WorkManager.getInstance().getStatusById(request.getId()).observe(this, new Observer<WorkStatus>() {
@Override
public void onChanged(WorkStatus workStatus) {
if(workStatus!=null && workStatus.getState().isFinished()){
//任務完成後取數據
String data = workStatus.getOutputData().getString(MainWork.HUICHUANDATA);
Log.i("zhang_xin","回傳到Activity的數據:"+data);
}
}
});
}
}
package com.example.workmanagertest;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.work.Data;
import androidx.work.Worker;
public class MainWork extends Worker {
public final static String HUICHUANDATA = "huichuandedata";
//這個方法是在子線程執行的
@NonNull
@Override
public Result doWork() {
//這裏面可以做很多事情,比如上傳,下載,同步數據。。。。。。
Log.i("zhang_xin","doWork......");
String data = getInputData().getString(MainActivity.WORKERKEY);
Log.i("zhang_xin","work收到的數據:"+data);
//把任務中的數據回傳到activity中
Data backData = new Data.Builder().putString(HUICHUANDATA,"完成了,這是回傳的數據").build();
setOutputData(backData);
return Result.SUCCESS;
}
}
看下打印輸出
2020-02-10 20:01:13.227 2628-2719/com.example.workmanagertest I/zhang_xin: doWork......
2020-02-10 20:01:13.227 2628-2719/com.example.workmanagertest I/zhang_xin: work收到的數據:張欣愛王學崗一生一世
2020-02-10 20:01:13.333 2628-2628/com.example.workmanagertest I/zhang_xin: 回傳到Activity的數據:完成了,這是回傳的數據
第二 定義多個任務,創建任務鏈
舉個例子,我們上傳圖片之前要先寫一個濾鏡,在對圖片壓縮,最後上傳。
創建四個Worker
package com.example.workmanagertest;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.work.Worker;
public class MainWork1 extends Worker {
public final static String HUICHUANDATA = "huichuandedata";
//這個方法是在子線程執行的
@NonNull
@Override
public Result doWork() {
//這裏面可以做很多事情,比如上傳,下載,同步數據。。。。。。
Log.i("zhang_xin","work1執行了");
return Result.SUCCESS;
}
}
package com.example.workmanagertest;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.work.Worker;
public class MainWork2 extends Worker {
public final static String HUICHUANDATA = "huichuandedata";
//這個方法是在子線程執行的
@NonNull
@Override
public Result doWork() {
//這裏面可以做很多事情,比如上傳,下載,同步數據。。。。。。
Log.i("zhang_xin","work2執行了");
return Result.SUCCESS;
}
}
package com.example.workmanagertest;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.work.Worker;
public class MainWork3 extends Worker {
public final static String HUICHUANDATA = "huichuandedata";
//這個方法是在子線程執行的
@NonNull
@Override
public Result doWork() {
//這裏面可以做很多事情,比如上傳,下載,同步數據。。。。。。
Log.i("zhang_xin","work3執行了");
return Result.SUCCESS;
}
}
package com.example.workmanagertest;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.work.Worker;
public class MainWork4 extends Worker {
public final static String HUICHUANDATA = "huichuandedata";
//這個方法是在子線程執行的
@NonNull
@Override
public Result doWork() {
//這裏面可以做很多事情,比如上傳,下載,同步數據。。。。。。
Log.i("zhang_xin","work4執行了");
return Result.SUCCESS;
}
}
在MainActivity中調用
package com.example.workmanagertest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.work.Data;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
import androidx.work.WorkStatus;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
//單次執行,worker只執行一次
OneTimeWorkRequest request1;
OneTimeWorkRequest request2;
OneTimeWorkRequest request3;
OneTimeWorkRequest request4;
public static final String WORKERKEY = "zhang_xin";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在Activity開啓任務,可以傳入數據到任務
Data data = new Data.Builder().putString(WORKERKEY,"張欣愛王學崗一生一世").build();
request1 = new OneTimeWorkRequest.Builder(MainWork1.class).setInputData(data).build();
WorkManager.getInstance().enqueue(request1);
request2 = new OneTimeWorkRequest.Builder(MainWork2.class).setInputData(data).build();
WorkManager.getInstance().enqueue(request2);
request3 = new OneTimeWorkRequest.Builder(MainWork3.class).setInputData(data).build();
WorkManager.getInstance().enqueue(request3);
request4 = new OneTimeWorkRequest.Builder(MainWork4.class).setInputData(data).build();
WorkManager.getInstance().enqueue(request4);
}
}
看下打印輸出
2020-02-10 20:11:03.252 3865-3940/com.example.workmanagertest I/zhang_xin: work3執行了
2020-02-10 20:11:03.260 3865-3939/com.example.workmanagertest I/zhang_xin: work2執行了
2020-02-10 20:11:03.268 3865-3941/com.example.workmanagertest I/zhang_xin: work4執行了
2020-02-10 20:11:03.275 3865-3938/com.example.workmanagertest I/zhang_xin: work1執行了
我們發現它的執行是無序的
現在我們讓它有順序的執行
package com.example.workmanagertest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.work.Data;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
import androidx.work.WorkStatus;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
//單次執行,worker只執行一次
OneTimeWorkRequest request1;
OneTimeWorkRequest request2;
OneTimeWorkRequest request3;
OneTimeWorkRequest request4;
public static final String WORKERKEY = "zhang_xin";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在Activity開啓任務,可以傳入數據到任務
Data data = new Data.Builder().putString(WORKERKEY, "張欣愛王學崗一生一世").build();
request1 = new OneTimeWorkRequest.Builder(MainWork1.class).setInputData(data).build();
request2 = new OneTimeWorkRequest.Builder(MainWork2.class).setInputData(data).build();
request3 = new OneTimeWorkRequest.Builder(MainWork3.class).setInputData(data).build();
request4 = new OneTimeWorkRequest.Builder(MainWork4.class).setInputData(data).build();
//1,順序執行
WorkManager.getInstance().beginWith(request1).then(request2).then(request3).then(request4).enqueue();
}
}
看下打印輸出
2020-02-10 20:20:23.626 4780-4814/? I/zhang_xin: work1執行了
2020-02-10 20:20:23.690 4780-4818/? I/zhang_xin: work2執行了
2020-02-10 20:20:23.743 4780-4819/? I/zhang_xin: work3執行了
2020-02-10 20:20:23.786 4780-4820/? I/zhang_xin: work4執行了
我們現在讓1和3先執行,2和四在執行
WorkManager.getInstance().beginWith(request1,request3).then(request2,request4).enqueue();
看下打印輸出
2020-02-10 20:23:18.590 5030-5091/com.example.workmanagertest I/zhang_xin: work3執行了
2020-02-10 20:23:18.601 5030-5090/com.example.workmanagertest I/zhang_xin: work1執行了
2020-02-10 20:23:18.728 5030-5113/com.example.workmanagertest I/zhang_xin: work2執行了
2020-02-10 20:23:18.737 5030-5090/com.example.workmanagertest I/zhang_xin: work4執行了
任務鏈的方式
WorkContinuation then1 = WorkManager.getInstance().beginWith(request1).then(request2);
WorkContinuation then2 = WorkManager.getInstance().beginWith(request4).then(request5);
WorkContinuation.combine(then1,then2).then(request3).enqueue();
打印輸出1和4執行,其次是2和5,最後是3.
任務的唯一性,同一個任務被加入裏隊列兩次以上,會對此執行,如果我們不想多次執行,可以這麼寫
WorkManager.getInstance()
.beginUniqueWork("unique", ExistingWorkPolicy.REPLACE
,request1).enqueue();
重複任務
PeriodicWorkRequest periodicWorkRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//復重任務,每隔一天執行一次
periodicWorkRequest=new PeriodicWorkRequest.Builder(
MainWorker.class,1, TimeUnit.DAYS
).build();
}
約束條件
Constraints constraints = new Constraints.Builder()
//網絡類型
.setRequiredNetworkType(NetworkType.CONNECTED)
//電量是否充足
.setRequiresBatteryNotLow(true)
//在待機狀態下執行
.setRequiresDeviceIdle(true)
//在存儲空間不足的時候
.setRequiresStorageNotLow(true)
//充電
.setRequiresCharging(true)
.build();
request=new OneTimeWorkRequest.Builder(MainWorker.class)
.setInputData(inputData)
.setConstraints(constraints)
.build();