Android可保活的、不依附于应用进程存活的后台任务框架:WorkManager

121 阅读2分钟

private void test() {

String TAG = "tag";

OneTimeWorkRequest a = getRequest(TAG, 1000, "A", TestWorker.class);

OneTimeWorkRequest b = getRequest(TAG, 2000, "B", TestWorker.class);

OneTimeWorkRequest c = getRequest(TAG, 3000, "C", TestWorker.class);

OneTimeWorkRequest d = getRequest(TAG, 4000, "D", TestWorker.class);

WorkManager.getInstance(this)

.enqueue(Arrays.asList(a, b, c, d));

LiveData<List> liveData = WorkManager.getInstance(this).getWorkInfosByTagLiveData(TAG);

liveData.observe(this, new Observer<List>() {

@Override

public void onChanged(List workInfos) {

System.out.println("长度:" + workInfos.size());

for (WorkInfo info : workInfos) {

if (info.getState() == WorkInfo.State.SUCCEEDED) {

Data data = info.getOutputData();

String s = data.getString(DATA);

Long time = data.getLong(TIME, -1);

String id = data.getString(ID);

System.out.println("onChanged:" + id + " " + s + " " + time);

}

}

}

});

System.out.println("UI Main线程Id:" + Thread.currentThread().getId());

//取消任务。

//UUID workId = workRequest.getId();

//WorkManager.getInstance().cancelByWorkId(workId);

}

private OneTimeWorkRequest getRequest(String tag, int time, String id, Class cls) {

//传递的参数数据。

Data data = new Data.Builder()

.putInt(TIME, time)

.putString(ID, id)

.putString(DATA, "phil " + id)

.build();

Constraints constraints = new Constraints.Builder()//触发规则。

.setRequiresStorageNotLow(false)

.setRequiresBatteryNotLow(false)

.setRequiresCharging(false)

.setRequiredNetworkType(NetworkType.NOT_REQUIRED)//对络连接不做要求。

.build();

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(cls)

.setInputData(data)

.setConstraints(constraints)

.addTag(tag)

.build();

return request;

}

}

package zhangphil.demo;

import android.content.Context;

import android.os.SystemClock;

import androidx.annotation.NonNull;

import androidx.work.Data;

import androidx.work.Worker;

import androidx.work.WorkerParameters;

public class TestWorker extends Worker {

private String id;

private int time;

public TestWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {

super(context, workerParams);

Data data = workerParams.getInputData();

time = data.getInt(MainActivity.TIME, -1);

id = data.getString(MainActivity.ID);

String content = data.getString(MainActivity.DATA);

System.out.println("Worker:传入数据->id:" + id + " time:" + time + " data:" + content);

}

/**

  • doWork()函数体已经线程化。

  • @return

*/

@NonNull

@Override

public Result doWork() {

//模拟耗时操作。

SystemClock.sleep(time);

System.out.println("doWork:" + id + "-线程Id:" + Thread.currentThread().getId() + " 完成");

//传输数据给外部监听者。

Data data = new Data.Builder()

.putString(MainActivity.ID, id)

.putString(MainActivity.DATA, "数据回传")

.putLong(MainActivity.TIME, System.currentTimeMillis())

.build();

return Result.success(data);

}

@Override

public void onStopped() {

super.onStopped();

}

}

输出:

15477-15477/? I/System.out: UI Main线程Id:2

15477-15498/? I/System.out: Worker:传入数据->id:A time:1000 data:phil A

15477-15496/? I/System.out: Worker:传入数据->id:B time:2000 data:phil B

15477-15498/? I/System.out: Worker:传入数据->id:C time:3000 data:phil C

15477-15493/? I/System.out: Worker:传入数据->id:D time:4000 data:phil D

15477-15477/? I/System.out: 长度:4

15477-15477/? I/System.out: 长度:4

15477-15502/zhangphil.app I/System.out: doWork:A-线程Id:609 完成

15477-15477/zhangphil.app I/System.out: 长度:4

15477-15477/zhangphil.app I/System.out: onChanged:A 数据回传 1561542140123

15477-15503/zhangphil.app I/System.out: doWork:B-线程Id:610 完成

15477-15477/zhangphil.app I/System.out: 长度:4