J'utilise ViewModels de Android Architecture depuis un certain temps maintenant, et je ne suis jamais en train d'exposer le ViewModel au contexte/aux vues (Android Framework/UI). Cependant, récemment, j'ai rencontré un intéressant problème.
Lors de la création d'une application de minuteur, lorsqu'un minuteur est démarré, un service est exécuté en arrière-plan exécutant le minuteur. De cette façon, lorsque l'application est fermée, le minuteur s'exécute toujours au premier plan dans la barre de notification jusqu'à ce que tous les minuteurs aient cessé. Cependant, cela signifie que tous mes objets Timer et l'état sont contenus dans ce service. Mon interface utilisateur doit être mise à jour à chaque tick, mais le modèle n'a pas nécessairement besoin d'être mis à jour Comment les ViewModels s'intègrent-ils dans ce scénario?
L'activité doit-elle recevoir les LocalBroadcasts et informer le ViewModel à chaque fois? Faut-il lire l'état de l'interface utilisateur dans Service-> Activity-> VM? Il semble presque que le service soit le ViewModel, mais cela ne semble pas efficace.
Après avoir joué avec différentes structures, le Service a trouvé sa place dans MVVM. Ce qui me décourageait dans cette situation, c'était de penser qu'un service ne devrait pas être démarré à partir d'un ViewModel et le fait que deux référentiels étaient nécessaires: la base de données de la salle pour stocker les temporisateurs et un service pour représenter l'état des temporisateurs en cours (onTick, play/pause statut, etc.). Un ViewModel ne doit pas avoir de référence aux vues, mais le contexte d'application est OK. Il est donc possible de démarrer le service à partir d'un ViewModel en étendant la classe AndroidViewModel. Voici la structure finale:
Couche modèle
ViewModel
UI