繁体   English   中英

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

[英]Android: Passing same variable between 3 activities?

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

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

您在这里有两个选择:

  1. 在您通过数据类实现SerializableParcelable之后,通过Intent发送它,
  2. 将数据对象保存到.txt文件,并在需要时读取它。

static它不是为这种事情创建的,在这种情况下,您不应该使用它。

我认为您应该选择第一个。

它确实取决于您的用例,但是我通常建议不要使用静态实现(要包括单例,请参阅单例有何缺点? )。 随着时间的推移,它们变得难以进行充分测试,并且(简而言之)可能会导致许多其他问题,具体取决于实施方式。

如果它是状态变化很少的相对简单的对象,那么一次只能在一个Activity中完成和/或不相关,则最好实现一个Parcelable并将其通过Intent传递给每个Activity

如果这是一个复杂的对象或可以动态更改的对象,则首选解决方案是使用依赖项注入平台(例如,如果使用的是Kotlin,则为Koin)来实例化数据并将其作为依赖项提供。 Koin非常简单明了,这是Koin网站上的一个非常基本的实现(仅遗漏了几行即可完成):

// 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])添加startKoin([list of modules]) 如果您想在自己的Activity MyRepository() ,则可以将其像val myRepo: MyRepository by inject()一样val myRepo: MyRepository by inject()包括在内。 我不知道这是否超出了您项目的范围,这完全取决于您要尝试做的事情。

这不是最好的方法(尽管确实没有一种完美的方法),但是您可以在自定义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

访问对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM