Les instances de la nouvelle classe ViewModel
peuvent survivre aux modifications de configuration si elles sont utilisées de la manière suivante:
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Cependant, en plus des modifications de configuration, il existe également un scénario de sauvegarde-restauration lorsque l'ensemble du processus de l'application est tué.
Les valeurs des champs à l'intérieur de ViewModel
seront-elles préservées pendant le scénario de sauvegarde-restauration?
Edit: basé sur la réponse à cette question, j'ai écrit cet article: Le composant d'architecture Android ViewModel est dangereux
Selon ViewModelProvider
documentation (vérifiez la méthode get
), ViewModel
n'est pas conservé lorsque le processus de l'application est tué:
Le ViewModel créé est associé à la portée donnée et sera conservé tant que la portée est vivante (par exemple, s'il s'agit d'une activité, jusqu'à ce qu'elle soit terminée ou que le processus soit tué)
De plus, vérifiez la réponse d'Ian Lake à une question similaire: https://medium.com/@ianhlake/you-are-correct-the-viewmodel-is-destroyed-if-your-process-is-killed-by -Android-ef611fcd51e6
Vous avez raison: le ViewModel est détruit si votre processus est tué par Android. Tout comme avant, vous devez utiliser onSaveInstanceState () pour stocker toutes les données dont vous avez besoin pour recréer ultérieurement votre activité dans le même état qu'auparavant.
Je recommande également de lire Le composant d'architecture Android ViewModel est dangereux .
Il semble que Google propose une solution pour cela maintenant
L'état de l'interface utilisateur est généralement stocké ou référencé dans les objets ViewModel, pas dans les activités; donc l'utilisation de onSaveInstanceState () nécessite un passe-partout que ce module peut gérer pour vous.
Lorsque le module est configuré, les objets ViewModel reçoivent un objet SavedStateHandle via son constructeur. Il s'agit d'une carte de valeurs-clés qui vous permettra d'écrire et de récupérer des objets vers et depuis l'état enregistré. Ces valeurs persisteront après l'arrêt du processus par le système et resteront disponibles via le même objet.
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc02'
(7 novembre 2019)
Afin de configurer un ViewModel pour recevoir un SavedStateHandle, vous devez les créer à l'aide d'une fabrique qui étend AbstractSavedStateVMFactory.
SavedStateViewModel vm = new ViewModelProvider(this, new SavedStateVMFactory(this))
.get(SavedStateViewModel.class);
Après cela, votre ViewModel peut avoir un constructeur qui reçoit un SavedStateHandle:
public class SavedStateViewModel extends ViewModel {
private SavedStateHandle mState;
public SavedStateViewModel(SavedStateHandle savedStateHandle) {
mState = savedStateHandle;
}
...
}
La classe SavedStateHandle a les méthodes que vous attendez pour une carte de valeurs-clés:
- get (touche chaîne)
- contient (clé de chaîne)
- supprimer (touche chaîne)
- set (clé de chaîne, valeur T)
- clés()