void executeJob(JobInvocation jobInvocation) {
    if (jobInvocation == null) {
      return;
    }

    // Check job constraints satisfied prior to starting job.
    if (!constraintChecker.areConstraintsSatisfied(jobInvocation)) {
      if (Log.isLoggable(TAG, Log.DEBUG)) {
        Log.d(TAG, "Not executing job because constraints still unmet. Job: " + jobInvocation);
      }
      jobFinishedCallback.onJobFinished(jobInvocation, JobService.RESULT_FAIL_RETRY);
      return;
    }
    if (Log.isLoggable(TAG, Log.DEBUG)) {
      Log.d(TAG, "Proceeding to execute job because constraints met. Job: " + jobInvocation);
    }

    synchronized (serviceConnections) {
      JobServiceConnection jobServiceConnection =
          serviceConnections.get(jobInvocation.getService());

      if (jobServiceConnection != null) {
        // We already have an open connection, so reuse that. The connection will handle both
        // duplicate execution requests and binder failures.
        jobServiceConnection.startJob(jobInvocation);
        return;
      }

      // No pre-existing connection, create a new one
      jobServiceConnection = new JobServiceConnection(execCallback, context);
      serviceConnections.put(jobInvocation.getService(), jobServiceConnection);
      // Queue the job
      jobServiceConnection.startJob(jobInvocation);
      // And kick off the bind
      boolean successfullyBound = tryBindingToJobService(jobInvocation, jobServiceConnection);

      if (successfullyBound) {
        // TODO(user): add a timeout to ensure the bind completes within ~18s or so
      } else {
        // TODO(user): we should track the number of times this happens and drop the job if
        //                     it happens too often.
        Log.e(TAG, "Unable to bind to " + jobInvocation.getService());
        jobServiceConnection.unbind();
      }
    }
  }
Executes the provided {@code jobInvocation} by kicking off the creation of a new Binder
connection to the Service.

<p>Note job is not executed if its constraints are still unsatisfied. E.g. disconnected network
connection for network-constrained jobs. In this case, job is failed but set to retry if
eligible using the {@code JobService.RESULT_FAIL_RETRY} code.
jobdispatcher/src/main/java/com/firebase/jobdispatcher/ExecutionDelegator.java