以前主流的包活是通过service相互守护,发送心跳广播,alarmmanager,jobshedue来进行实现,当前google推出了workmannager,他可以自主根据api版本和实际情况选择不同方式,最低支持api14可以省去繁琐的保护代码,几乎可以替换service的作用。当前最高版本是androidx.work:work-runtime:2.2.0,需要迁移到androidx
- 在运行 API 23 及以上级别的设备上使用 JobScheduler
- 在运行 API 14-22 的设备上结合使用 BroadcastReceiver 和 AlarmManager
workmanager只要当前app存在workmanager会一直持续执行,亲测起码两天没毛病。其基础使用如下
//新建一个继承Worker的类
public class Mywork extends Worker {
public Mywork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
//真正需要执行的事
doSomthing();
/**
* 返回值一共有五种
* 基础的有是三种
* Result.success()
* Result.retry()
* Result.failure()
* 剩下两种是带有输出数据
* Result.success(Data outputData)
* Result.failure(Data outputData)
*/
return Result.success();
}
public void doSomthing(){
}
}
/**
*构建一个请求,一共有两种请求,一种是只执行一次的OneTimeWorkRequest
*/
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(Mywork.class).build();
/**
*另一种是循环执行的PeriodicWorkRequest,循环执行需要配置时间间隔和时间单位,但是时间间隔不能无限小,根据源码最小间隔为15分钟。
*
*/
PeriodicWorkRequest workRequest =new PeriodicWorkRequest.Builder(Mywork.class, 1, TimeUnit.HOURS).build();
WorkManager.getInstance(this).enqueue(workRequest);
以上几步就是最基础的操作和注释。在实际使用的时候我用的循环请求,但是我发现你即使覆盖安装,以前的workmanager还是会存在,虽然workmanager的耗费较小但是这个效果并不符合预期,因此更加深入的了解了一下发现可以使用唯一的request。
/**
* 个主要新添加了两个参数,一个是唯一性标识,另一个是已存在的的request的规则
* 规则有两个
* ExistingPeriodicWorkPolicy.KEEP 保持原来
* ExistingPeriodicWorkPolicy.REPLACE 替换
*这个是PeriodicWorkRequest
*/
WorkManager.getInstance(this).enqueueUniquePeriodicWork("id", ExistingPeriodicWorkPolicy.KEEP,workRequest);
/**
* 有多个规则
* KEEP 保持原来
* APPEND 追加
* REPLACE 替换
* 这个是OneTimeWorkRequest
*/
WorkManager.getInstance(this).enqueueUniqueWork("id", ExistingWorkPolicy.APPEND,oneTimeWorkRequest);
这些知识可以实现大部分的功能,但是还不能形成完整的制体系,因此对没有用到的知识也需要做一下整理。分为以下模块:
- 添加约束条件(这个主要是指定在某种状态下进行操作)
Constraints constraints = new Constraints.Builder().setRequiresBatteryNotLow(true).build();
PeriodicWorkRequest workRequest =new PeriodicWorkRequest.Builder(Mywork.class, 1, TimeUnit.HOURS)
.setConstraints(constraints)
.build();
除了在设置在电量不低的情况下进行操作还有如下的约束条件
- setRequiresCharging(boolean requiresCharging)设置在充电时进行
- setRequiresDeviceIdle(boolean requiresDeviceIdle)是否空闲
- setRequiredNetworkType(@NonNull NetworkType networkType)设置某种网络类型
- setRequiresStorageNotLow(boolean requiresStorageNotLow)存储不低的情况下