这里面存在三个Factory:Factory,KeyedFactory和OnrequeryFactory,keyedFactory和Factory相比就是create方法中多了一个key参数。
ViewModelStore获取到ViewModel时,会判断当前mFactory是否是OnRequeryFactory类型的,是的话会回调onRequery方法
那么OnRequeryFactory回调onRequery有什么用呢?其实ViewModel不仅可以因为配置改变可以恢复Activity数据,也能恢复因为系统资源紧张而回收掉的Activity数据,只不过后者需要依靠SaveStateHandler
总结:ViewModelProvider获取到ViewModel:
1,首先创建ViewModelProvider传入ViewModelStoreOwner和Factory 2,调用ViewModelProvider的get方法,从ViewModelStore中获取ViewModel,有则直接返回,没有就创建后返回。
4. ViewModel的恢复
ViewModel是从ViewModelStore中获取
ViewModelStore是通过ViewModelStoreOwner.getViewModelStore方法获取
ComponentActivity实现了ViewModelStoreOwner接口和HasDefaultViewModelProviderFactory
4.1 ComponentActivity # getViewModelStore()
@Override
public ViewModelStore getViewModelStore() {
if (getApplication() == null) {
throw new IllegalStateException("Your activity is not yet attached to the "
- “Application instance. You can’t request ViewModel before onCreate call.”);
}
ensureViewModelStore();
retu