I don't think one can explain it any better than the launchd.plist(5) man page (emphasis mine):
KeepAlive <boolean or dictionary of stuff>
This optional key is used to control whether your job is to be kept con-
tinuously running or to let demand and conditions control the invocation.
The default is false and therefore only demand will start the job. The
value may be set to true to unconditionally keep the job alive. Alterna-
tively, a dictionary of conditions may be specified to selectively con-
trol whether launchd keeps a job alive or not. If multiple keys are pro-
vided, launchd ORs them, thus providing maximum flexibility to the job to
refine the logic and stall if necessary. If launchd finds no reason to
restart the job, it falls back on demand based invocation. Jobs that
exit quickly and frequently when configured to be kept alive will be
throttled to converve system resources.
SuccessfulExit <boolean>
If true, the job will be restarted as long as the program exits and
with an exit status of zero. If false, the job will be restarted
in the inverse condition. This key implies that "RunAtLoad" is set
to true, since the job needs to run at least once before we can get
an exit status.