根据我们之前的入口进行代码分析:
// 约束条件,必须满足我的条件,才能执行后台任务 (在连接网络,插入电源 并且 处于空闲时) 内部做了电量优化(Android App 不耗电)
Constraints myConstraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // 网络链接中...
.setRequiresCharging(true) // 充电中..
.setRequiresDeviceIdle(true) // 空闲时.. (没有玩游戏)
.build();
// 请求对象
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(WorkManager2.class)
.setConstraints(myConstraints) // TODO 3 约束条件的执行
.build();
WorkManager.getInstance(this) // TODO 1 初始化工作源码
.enqueue(request); // TODO 2 加入队列执行
Jetpack WorkManager 流程
初始化工作
WorkManager.getInstance 初始化了WorkManagerImpl
但是第一次初始化不再这里,查看apk中的配置清单文件
WorkManagerImpl 初始化做的事情
- 创建数据库,create中使用的是Room
WorkDatabase#create - 老版本,任务线程沲的创建 。新版本,任务线程池的传递
- 创建Processor
- 检查应用程序强制停止Checks for app force stops.
ForceStopRunnable强制停止线程
线程中mWorkManager.rescheduleEligibleWork()重新安装合适的工作任务
加入队列执行任务
EnqueueRunnable( )的scheduleWorkInBackground方法 得到
得到配置,工作数据库,调度信息
循环scheduler.schedule(eligibleWorkSpecsArray);
有两个过滤条件,有条件的约束和无约束
schedule方法可以看出来有三种
GreedyScheduler 贪婪调度器
SystemJobScheduler
SystemAlarmScheduler
拿这个为例GreedyScheduler#schedule
- 无约束条件
如果是无约束 mWorkManagerImpl.startWork(workSpec.id);
new StartWorkRunnable中的run方法
这里会调用Processor的startWork方法。
Processor类->startWork中创建WorkerWrapper()并放入线程沲中去执行()
WorkerWrapper类的run方法
进入runWork方法
mInnerFuture = mWorker.startWork();
(Worker类)result = mWorker.doWork();
到此我们的任务被执行
2.带上运行条件的(以网络为例)
NetworkStateProxy类的父类ConstraintProxy
约束条件加入后,我们看下apk反编译的清单文件
脑图流程分析
核心方法
CommandHandler#onHandleIntent(mCurrentIntent, startId, SystemAlarmDispatcher.this)
@WorkerThread
void onHandleIntent(
@NonNull Intent intent,
int startId,
@NonNull SystemAlarmDispatcher dispatcher) {
String action = intent.getAction();
if (ACTION_CONSTRAINTS_CHANGED.equals(action)) {
handleConstraintsChanged(intent, startId, dispatcher);
} else if (ACTION_RESCHEDULE.equals(action)) {
handleReschedule(intent, startId, dispatcher);
} else {
Bundle extras = intent.getExtras();
if (!hasKeys(extras, KEY_WORKSPEC_ID)) {
Logger.get().error(TAG,
String.format("Invalid request for %s, requires %s.",
action,
KEY_WORKSPEC_ID));
} else {
if (ACTION_SCHEDULE_WORK.equals(action)) {
handleScheduleWorkIntent(intent, startId, dispatcher);
} else if (ACTION_DELAY_MET.equals(action)) {
handleDelayMet(intent, startId, dispatcher);
} else if (ACTION_STOP_WORK.equals(action)) {
handleStopWork(intent, dispatcher);
} else if (ACTION_EXECUTION_COMPLETED.equals(action)) {
handleExecutionCompleted(intent, startId);
} else {
Logger.get().warning(TAG, String.format("Ignoring intent %s", intent));
}
}
}
}
NetworkStateProxy类的父类ConstraintProxy 广播实现
createConstraintsChangedIntent方法设置ACTION
ACTION_CONSTRAINTS_CHANGED
开启一个服务startService,比如SystemAlarmService
---->
createConstraintsChangedIntent方法设置ACTION
ACTION_CONSTRAINTS_CHANGED
开启一个服务startService,比如SystemAlarmService
----> SystemAlarmDispatcher类add方法 ----> processCommand();
----> onHandleIntent----->action换成了ACTION_DELAY_MET
-----> 如流程图所示,DelayMetCommandHandler类onAllConstraintsMet方法,继续跟踪
---->最终还是
Processor类->startWork中创建WorkerWrapper()并放入线程沲中去执行()
---->
WorkerWrapper类的run方法
进入runWork方法
mInnerFuture = mWorker.startWork();
(Worker类)result = mWorker.doWork();
到此我们的任务被执行