¿Cuáles son las diferencias entre FLAG_ACTIVITY_RESET_TASK_IF_NEEDED y FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP?

Estoy en el proceso de (finalmente) escribir el capítulo sobre tareas para mi libro, y me encuentro con algunos rompecabezas persistentes.

Las cosas que sirven como iniciadores de pantalla de inicio parecen usar la combinación deFLAG_ACTIVITY_NEW_TASK yFLAG_ACTIVITY_RESET_TASK_IF_NEEDED cuando inician la actividad de iniciador solicitada:

Intent i=new Intent(Intent.ACTION_MAIN);

i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
            Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(name);

startActivity(i);  

La documentación paraFLAG_ACTIVITY_RESET_TASK_IF_NEEDED tiene:

Si se establece, y esta actividad se inicia en una nueva tarea o lleva a la cima una tarea existente, se iniciará como la puerta de entrada de la tarea. Esto dará como resultado la aplicación de cualquier afinidad necesaria para tener esa tarea en el estado apropiado (ya sea moviendo actividades hacia o desde ella), o simplemente restableciendo esa tarea a su estado inicial si es necesario.

Eso no está especialmente claro.

En particular, parecería que se verían los mismos efectos usando una combinación deFLAG_ACTIVITY_CLEAR_TOP yFLAG_ACTIVITY_SINGLE_TOP. Citando los documentos paraFLAG_ACTIVITY_CLEAR_TOP:

Si está configurado, y la actividad que se está iniciando ya se está ejecutando en la tarea actual, en lugar de lanzar una nueva instancia de esa actividad, todas las demás actividades se cerrarán y esta intención se entregará al (ahora en arriba) actividad anterior como nueva intención ...

La instancia actualmente en ejecución de [la actividad deseada] recibirá la nueva intención que está comenzando aquí en su método onNewIntent (), o se terminará y reiniciará con la nueva intención. Si ha declarado que su modo de inicio es "múltiple" (el valor predeterminado) y no ha configurado FLAG_ACTIVITY_SINGLE_TOP en la misma intención, se finalizará y se volverá a crear; para todos los demás modos de inicio o si FLAG_ACTIVITY_SINGLE_TOP está configurado, esta intención se entregará a la instancia actual onNewIntent ().

losFLAG_ACTIVITY_CLEAR_TOP documentación tiene sentido, al menos para mí.

Entonces, que haceFLAG_ACTIVITY_RESET_TASK_IF_NEEDED hacer eso es diferente a la combinación deFLAG_ACTIVITY_CLEAR_TOP yFLAG_ACTIVITY_SINGLE_TOP?

Puntos de bonificación si puedes explicar quéFLAG_ACTIVITY_CLEAR_TASK ¿eso es diferente de cualquiera de las otras dos opciones descritas anteriormente?

Si se establece en un Intento pasado a Context.startActivity (), este indicador hará que cualquier tarea existente que esté asociada con la actividad se borre antes de que se inicie la actividad. Es decir, la actividad se convierte en la nueva raíz de una tarea que de otro modo estaría vacía, y cualquier actividad anterior ha finalizado. Esto solo se puede usar junto con FLAG_ACTIVITY_NEW_TASK.

Una diferencia obvia entre esto yFLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP es esoFLAG_ACTIVITY_CLEAR_TASK necesidadesFLAG_ACTIVITY_NEW_TASK. Pero, aparte de eso, parecería que los efectos netos son los mismos, y también coincidenFLAG_ACTIVITY_RESET_TASK_IF_NEEDED.

Respuestas a la pregunta(3)

Su respuesta a la pregunta