Patrón MVVM y startActivity

Recientemente decidí echar un vistazo más de cerca a los nuevos Componentes de Arquitectura de Android que lanzó Google, especialmente usando su clase consciente del ciclo de vida de ViewModel para una arquitectura MVVM y LiveData.

Mientras esté lidiando con una sola Actividad, o un solo Fragmento, todo está bien.

Sin embargo, no puedo encontrar una buena solución para manejar el cambio de actividad. Digamos, en aras de un breve ejemplo, que la Actividad A tiene un botón para iniciar la Actividad B.

¿Dónde se manejaría startActivity ()?

Siguiendo el patrón MVVM, la lógica de clickListener debe estar en ViewModel. Sin embargo, queremos evitar tener referencias a la Actividad allí. Por lo tanto, pasar el contexto al ViewModel no es una opción.

Reduje un par de opciones que parecen "OK", pero no pude encontrar una respuesta adecuada de "aquí está cómo hacerlo".

Opción 1 : Tenga una enumeración en ViewModel con asignación de valores a una posible ruta (ACTIVITY_B, ACTIVITY_C). Combina esto con un LiveData. La actividad observaría este LiveData, y cuando ViewModel decida que ACTIVITY_C debe iniciarse, simplemente publicará Valor (ACTIVITY_C). La actividad puede llamar a startActivity () normalmente.

opcion 2 : El patrón de interfaz normal. El mismo principio que la opción 1, pero Activity implementaría la interfaz. Sin embargo, siento un poco más de acoplamiento con esto.

Opción 3 : Opción de mensajería, como Otto o similar. ViewModel envía un Broadcast, Activity lo recoge y lanza lo que tiene que hacer. El único problema con esta solución es que, de forma predeterminada, debe colocar el registro / anulación del registro de esa transmisión dentro del ViewModel. Entonces no ayuda.

Opcion 4 : Tener una gran clase de enrutamiento, en algún lugar, como singleton o similar, que podría llamarse para enviar enrutamiento relevante a cualquier actividad. Finalmente a través de la interfaz? Entonces cada actividad (o una BaseActivity) implementaría

IRouting { void requestLaunchActivity(ACTIVITY_B); }

Este método me preocupa un poco cuando su aplicación comienza a tener muchos fragmentos / actividades (porque la clase de enrutamiento se volvería enorme)

Eso es todo. Esa es mi pregunta ¿Cómo manejan esto? ¿Vas con una opción que no pensé? ¿Qué opción consideras más relevante y por qué? ¿Cuál es el enfoque recomendado de Google?

PD: Enlaces que no me llevaron a ninguna parte 1 -Llamada de Android ViewModel Métodos de actividad 2 -¿Cómo iniciar una actividad desde una simple clase Java sin actividad?

Respuestas a la pregunta(2)

Su respuesta a la pregunta