Android:在3个活动之间传递相同的变量?

时间:2018-12-22 20:41:31

标签: java android android-intent kotlin static

因此,我有一个(Kotlin)数据类,该数据类在启动活动中实例化(我们仅将对象称为dataObj)。我还有另外两个活动需要访问在启动时实例化的dataObj。我知道我可以让我的数据类实现Serializable接口,以便可以使用意图在三个活动之间传递对象。但是我也一直在考虑可以在构造函数中使用静态变量,以便可以轻松地获取类的值。我只是想弄清楚什么是推荐的,什么是好的做法。

4 个答案:

答案 0 :(得分:1)

与此有关的一个大问题是,静态变量无法在Android低内存状态中幸免,而在两次幸存之间发送意图。另请参阅此处有关静态变量的内容。 (Link)

答案 1 :(得分:1)

您在这里有两个选择:

  1. 由您的数据类实现IntentSerializable后,通过Parcelable发送它,
  2. 将数据对象保存到.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

访问对象。