Strutturo la mia applicazione Android seguendo la Architettura pulita di Uncle Bob che comprende almeno almeno i seguenti livelli rilevanti: -
- Presentazione - Utilizzo dell'approccio MVVM. Questo strato contiene le attività di Android e i corrispondenti ViewModels.
- Interact : questo layer incapsula la logica dei casi d'uso dell'applicazione e viene chiamato da diversi ViewModels per ottenere attività specifiche per il business. Può anche mantenere lo stato che riflette lo stato di avanzamento di un'attività.
Attualmente, nella mia applicazione ci sono una serie di casi d'uso o flussi di lavoro. Ogni flusso di lavoro passerà attraverso una sequenza specifica di pagine (ad esempio Attività o Frammenti). Poiché ha solo poche pagine e flussi di lavoro, è semplicemente logico inserire esplicitamente la logica di navigazione all'interno di ciascun ViewModel. Supponiamo che ci sia un caso d'uso A che segue le seguenti attività: -
Usa il caso A
[HomeActivity] --> [ActivityA] --> [ActivityB]
Immagina che AttivitàA presenti un utente con un elenco di elementi per la selezione per i quali verrà eseguito il suo intervento nella AttivitàB . Nell'attivitàA, ho semplicemente chiamato
startActivity(new Intent(this, ActivityB.class))
per navigare in ActivityB quando l'utente ha selezionato un elemento e ha già chiamato un interactor per mantenere lo stato di quale elemento è stato selezionato da un utente.
...
Ora il problema sorge, un'azienda ha bisogno di un nuovo caso d'uso B che disegna un flusso di lavoro diverso ma riutilizza la stessa ActivityA nel suo flusso di lavoro.
Usa il caso B.
[HomeActivity] --> [ActivityA] --> [ActivityC]
Come puoi vedere, ora ActivityA può navigare non solo sull'attività B ma anche su ActivityC a seconda del caso d'uso a cui è stato preso parte. Mentre la maggior parte della logica in ActivityA così come la sua visualizza XML e il suo ViewModel è abbastanza generico da essere riutilizzato in entrambi i casi d'uso, la parte di navigazione no.
Come posso affrontare questo problema di navigazione in modo che il codice in ActivityA e i suoi elementi correlati sia abbastanza generico da poter essere riutilizzato in qualsiasi flusso di lavoro? Qual è la soluzione più elegante dalla tua idea?