你的自定义ViewModel只是一个数据容器,因为它与你的视图绑定(并且它是一个Observable对象),所以它可以通知视图关于数据变化的信息。然而,它不知道配置更改,比如屏幕方向的变化,因此,在这种情况下,程序员应该保存和恢复数据,例如在这个例子中。另一方面,由Android提供的ViewModel知道这些配置更改,因此它的数据在整个活动生命周期中都是一致的。当活动销毁时,ViewModel也会被销毁。
ViewModel()和AndroidViewModel()的主要区别在于,AndroidViewModel()具有对应用程序上下文的引用(而不是活动上下文本身)。活动在配置更改时(如旋转手机)应被销毁并重新创建。因此,向ViewModel传递上下文是一个坏主意,因为它容易导致内存泄漏(对已销毁的活动的引用)。ViewModel旨在幸存这些配置更改,但ViewModel()没有任何对上下文的引用。另一方面,AndroidViewModel()具有对应用程序(一种特殊类型的上下文)的引用,因此您可以访问特定于应用程序的信息,如PackageManager。class MyViewModel(application: Application) : AndroidViewModel(application)