如何在视图模型中访问软件包管理器



我使用的是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

最新更新