applicationWillEnterForeground vs. applicationDidBecomeActive, applicationWillResignActive vs. applicationDidEnterBackground

¿Cuál es el delegado adecuado para implementar cuando una aplicación está despertando de estar en segundo plano y desea que se prepare para que esté activa?

applicationWillEnterForeground vs applicationDidBecomeActive - ¿Cuál es la diferencia?

¿Cuál es el delegado apropiado para implementar cuando una aplicación va a dormir y desea prepararla para limpiar y guardar datos?

applicationWillResignActive vs. applicationDidEnterBackground: ¿cuál es la diferencia?

Además, he notado que se llama a applicationWillResignActive cuando entra un SMS o una llamada entrante, pero el usuario elige hacer clic en Aceptar y continuar. No quiero que mi aplicación tome ninguna medida en estos casos. Solo quiero que siga ejecutándose sin ninguna limpieza intermedia ya que el usuario no salió de la aplicación. Entonces, creo que tiene más sentido hacer un trabajo de limpieza solo en applicationDidEnterBackground.

Agradecería su aporte sobre las mejores prácticas a seguir para elegir qué delegados implementar para despertarse e irse a dormir, así como considerar eventos como ser interrumpidos por SMS / llamadas.

Gracias