Google Android新框架jetpack相关讲解Room、WorkManager、LifeCycles、LiveData、ViewModel、DataBinding等讲解
很多的开发者估计还在使用几年前的框架和产品,对新发布的很陌生,不知道如何使用。经过几天的阅读官方英文文档的学习,整理了下基本的用法和特点,其中我认为WorkManager很强大,需要的地方可以替代以前的方案。LifeCycles也不错,扩展其他类具有关联生命周期的。还有Room数据库的框架,简单了很多。LiveData和ViewModel的结合基本上就是RxJava和RxAndroid的结合的功能了。对于DataBinding,可能耦合性太高,不太方便使用。主要大家需要了解的就是这几个,其他的可以了解。
好了,先给个官方的文档地址吧:https://developer.android.google.cn/jetpack/
先来讲解WorkManager这个框架。
WorkManager真的很强大,从名字就可以大概看出来,是任务管理的。很多人之前都在想什么进程守护,进程保活,APP的后台Service被杀死了怎么办?WorkManager的特点就是可以在APP被杀死、关闭、甚至机器重启后还会继续执行你设置的任务,并且你可以个性化设置你的任务执行的时间段、范围,例如在APP存活时?充电时?电量低时?...等等。可以执行一次任务、可以定时执行等等。有了WorkManager,你之前担心的问题都迎刃而解。不过我一直在想,Google开放了这么大权限的框架和API,会产生很多后台杀不死的流氓软件吧?会造成系统更卡,更耗电,更不安全吧?具体不清楚。
官方也说了,即时你强制关闭了APP,任务也会照样可以正常执行。
那么,接下来我们看看WorkManager的用法。
1、创建一个Work类,继承自Worker,里面写具体的任务逻辑。
package com.google.androidarc.utils;
import android.support.annotation.NonNull;
import androidx.work.Worker;
public class TestWork extends Worker {
@NonNull
@Override
public WorkerResult doWork() {
// System.out.println("执行任务,非UI线程");
return WorkerResult.SUCCESS;
}
}
2、运行一次任务,多个任务,周期性执行任务,也可以传入和传出数据,为了方便,我就写在一起了。
private void worker() {
//数据传输
Data data = new Data.Builder().putString("string", "text").build();
//设置任务约束
Constraints constraints = new Constraints.Builder()
// .setRequiresDeviceIdle(true)
// .setRequiresCharging(true)
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
//运行一次任务
OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(TestWork.class).setInitialDelay(5, TimeUnit.SECONDS)
.setConstraints(constraints)
.setInputData(data).addTag("tag").build();
WorkManager.getInstance().enqueue(oneTimeWorkRequest);
//周期定期执行任务
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(TestWork.class, 5000, TimeUnit.MILLISECONDS).build();
WorkManager.getInstance().enqueue(periodicWorkRequest);
//链式执行任务
WorkContinuation chain1 = WorkManager.getInstance()
.beginWith(oneTimeWorkRequest)
.then(oneTimeWorkRequest);
WorkContinuation chain2 = WorkManager.getInstance()
.beginWith(oneTimeWorkRequest)
.then(oneTimeWorkRequest);
WorkContinuation chain3 = WorkContinuation
.combine(chain1, chain2)
.then(oneTimeWorkRequest);
chain3.enqueue();
//输出任务结果
WorkManager.getInstance().getStatusesByTag("tag").observe(this, new Observer<List<WorkStatus>>() {
@Override
public void onChanged(@Nullable List<WorkStatus> workStatuses) {
if (workStatuses != null && workStatuses.get(0).getState().isFinished()) {
String result = workStatuses.get(0).getOutputData().getString("string", "");
System.out.println("输出:" + result);
}
}
});
}
3、接收的地方接收数据可以这样写,也可以输出结果数据回调。
package com.google.androidarc.utils;
import android.support.annotation.NonNull;
import androidx.work.Data;
import androidx.work.Worker;
public class TestWork extends Worker {
@NonNull
@Override
public WorkerResult doWork() {
System.out.println("执行" + getInputData().getString("string", ""));
Data data = new Data.Builder().putString("string", "执行" + getInputData().getString("string", "")).build();
setOutputData(data);
return WorkerResult.SUCCESS;
}
}