作用: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();