我使用的是fragment,现在我将ViewModel附加到它,并将代码传输到ViewModel和activity?.packageManager?.getPackageInfo(uri, PackageManager.GET_ACTIVITIES)
。这一行显示了一个错误。如何在ViewModel中访问包管理器?
正在将AndroidViewModel
而不是ViewModel
扩展为:
class MyFragmentViewModel(application: Application) : AndroidViewModel(application) {
...
现在您可以拨打:
application.packageManager?.getPackageInfo(uri, PackageManager.GET_ACTIVITIES)
理论上,如果你正在实现MVVM模式(我看到你在实现ViewModel),那么android.*层应该在View中处理,Activities/Context不应该在ViewModel中管理,以避免内存泄漏。尽管根据项目上下文的不同,这个规则并不是适用于每一个项目上下文,但我认为最好的方法是(如果没有使用依赖注入)有一个应用程序提供程序。
创建对象:
object ApplicationProvider {
@Volatile
lateinit var application: Application
fun initialize(_application: Application) {
if (!::application.isInitialized) {
synchronized(this) {
application = _application
}
}
}
}
在MainActivity中,将ApplicationProvider初始化如下:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
ApplicationProvider.initialize(this.application)
}
现在,您可以访问整个项目中需要的ApplicationContext:
ApplicationProvider.application.applicationContext
记住不要将ApplicationContext分配给静态字段(例如val)以避免内存泄漏
PD:我不是很喜欢AndroidViewModel,但我想这也是一个很好的解决方案,正如一位同事之前提到的那样:D