因此,我有一个(Kotlin)数据类,该数据类在启动活动中实例化(我们仅将对象称为dataObj
)。我还有另外两个活动需要访问在启动时实例化的dataObj
。我知道我可以让我的数据类实现Serializable
接口,以便可以使用意图在三个活动之间传递对象。但是我也一直在考虑可以在构造函数中使用静态变量,以便可以轻松地获取类的值。我只是想弄清楚什么是推荐的,什么是好的做法。
答案 0 :(得分:1)
与此有关的一个大问题是,静态变量无法在Android低内存状态中幸免,而在两次幸存之间发送意图。另请参阅此处有关静态变量的内容。 (Link)
答案 1 :(得分:1)
您在这里有两个选择:
Intent
或Serializable
后,通过Parcelable
发送它,.txt
文件中,并在需要时读取。 static
并不是为这种事情而创建的,在这种情况下,您不应使用它。
我认为您应该选择第一种。
答案 2 :(得分:1)
这实际上取决于您的用例,但是我通常建议不要使用静态实现(要包含单例,请参见What is so bad about singletons?)。随着时间的流逝,它们变得难以进行充分测试,并且(简而言之)可能会导致许多其他问题,具体取决于实施方式。
如果它是状态变化很少发生的相对简单的对象,则一次只能在一个Activity中完成,和/或无关紧要,实现Parcelable
并将其通过{传递给每个Activity
{1}}可能是最好的。
如果这是一个复杂的对象或可以动态更改的对象,则首选解决方案是使用依赖项注入平台(例如,如果使用的是Kotlin,则为Koin)来实例化数据并将其作为依赖项提供。 Koin非常简单,这是Koin网站上的一个非常基本的实现(仅遗漏了几行即可完成):
Intent
在这种情况下,示例中的对象将类似于// Injected by constructor
class MyViewModel(val repo : MyRepository) : ViewModel()
// declared ViewModel using the viewModel keyword
val myModule : Module = module {
viewModel { MyViewModel(get()) }
single { MyRepository() }
}
// Just get it
class MyActivity() : AppCompatActivity() {
// lazy inject MyViewModel
val vm : MyViewModel by viewModel()
}
。您只需要从此处添加MyRepository()
。如果您想在startKoin([list of modules])
中加入MyRepository()
,则可以像Activity
那样包含它。我不知道这是否超出了您的项目范围,这完全取决于您要确切执行的操作。
答案 3 :(得分:0)
这不是最好的方法(尽管实际上并不是一种完美的方法),但是您可以在自定义Application类中实例化它。
class App : Application() {
val yourObject by lazy { YourObject() } //by lazy is useful if the Object needs to hold a Context or something that isn't immediately available
}
在清单的android:name=".App"
标签中添加application
,以便实际使用您的App类。 .App
假定它位于应用程序包的根目录中。
然后,在您引用上下文的任何地方,您都可以执行以下操作:
(context.applicationContext as App).yourObject
访问对象。