Padrão MVVM e startActivity

Recentemente, decidi dar uma olhada mais de perto nos novos componentes da arquitetura Android lançados pelo Google, especialmente usando a classe com reconhecimento do ciclo de vida do ViewModel em uma arquitetura MVVM e o LiveData.

Desde que eu esteja lidando com uma única atividade ou um único fragmento, tudo está bem.

No entanto, não consigo encontrar uma boa solução para lidar com a alternância de atividades. Digamos, por um breve exemplo, que a Atividade A tenha um botão para iniciar a Atividade B.

Onde o startActivity () seria tratado?

Seguindo o padrão MVVM, a lógica do clickListener deve estar no ViewModel. No entanto, queremos evitar ter referências à atividade lá. Portanto, passar o contexto para o ViewModel não é uma opção.

Eu reduzi algumas opções que parecem "OK", mas não consegui encontrar nenhuma resposta adequada de "aqui está como fazê-lo".

Opção 1 : Tenha uma enumeração no ViewModel com mapeamento de valores para possível roteamento (ACTIVITY_B, ACTIVITY_C). Junte isso com um LiveData. A atividade observaria esse LiveData e, quando o ViewModel decidir que ACTIVITY_C deve ser iniciado, ele apenas publicará o Valor (ACTIVITY_C). A atividade pode então chamar startActivity () normalmente.

opção 2 : O padrão de interface regular. Mesmo princípio da opção 1, mas o Activity implementaria a interface. Eu me sinto um pouco mais acostumado com isso.

Opção 3 : Opção de mensagens, como Otto ou similar. O ViewModel envia uma transmissão, a atividade pega e lança o que é necessário. O único problema dessa solução é que, por padrão, você deve colocar o registro / cancelamento de registro dessa transmissão dentro do ViewModel. Então não ajuda.

Opção 4 : Ter uma classe de roteamento grande, em algum lugar, como singleton ou similar, que poderia ser chamada para enviar roteamento relevante para qualquer atividade. Eventualmente via interface? Portanto, toda atividade (ou uma BaseActivity) implementaria

IRouting { void requestLaunchActivity(ACTIVITY_B); }

Esse método me preocupa um pouco quando seu aplicativo começa a ter muitos fragmentos / atividades (porque a classe Routing se tornaria enorme)

Então é isso. Essa é a minha pergunta. Como vocês lidam com isso? Você vai com uma opção que eu não pensei? Que opção você considera mais relevante e por quê? Qual é a abordagem recomendada do Google?

PS: Links que não me levaram a lugar algum 1 -Chamada Android ViewModel Métodos de atividade 2 -Como iniciar uma atividade a partir de uma classe java simples sem atividade?

questionAnswers(2)

yourAnswerToTheQuestion