Jetpack WorkManager 原理

根据我们之前的入口进行代码分析:

// 约束条件,必须满足我的条件,才能执行后台任务 (在连接网络,插入电源 并且 处于空闲时)  内部做了电量优化(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 流程

2021-01-27 18.14.39.png

初始化工作

WorkManager.getInstance 初始化了WorkManagerImpl

但是第一次初始化不再这里,查看apk中的配置清单文件

2021-01-27 17.27.26.png

WorkManagerImpl 初始化做的事情

  1. 创建数据库,create中使用的是Room
    WorkDatabase#create
  2. 老版本,任务线程沲的创建 。新版本,任务线程池的传递
  3. 创建Processor
  4. 检查应用程序强制停止Checks for app force stops.
    ForceStopRunnable强制停止线程
    线程中mWorkManager.rescheduleEligibleWork()重新安装合适的工作任务

加入队列执行任务

2021-01-27 18.40.34.png

EnqueueRunnable( )的scheduleWorkInBackground方法 得到
得到配置,工作数据库,调度信息

循环scheduler.schedule(eligibleWorkSpecsArray);

有两个过滤条件,有条件的约束和无约束

schedule方法可以看出来有三种
GreedyScheduler 贪婪调度器
SystemJobScheduler
SystemAlarmScheduler

拿这个为例GreedyScheduler#schedule

  1. 无约束条件
2021-01-27 19.49.18.png

如果是无约束 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反编译的清单文件

2021-01-27 20.05.42.png

脑图流程分析

2021-01-27 20.46.55.png

核心方法

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();
到此我们的任务被执行

你可能感兴趣的:(Jetpack WorkManager 原理)