Scala对象能否在Android上重新启动活动?

时间:2011-09-15 06:02:13

标签: android scala lifecycle

我正在使用Scala编写Android应用程序,但我无法找到这个问题的明确答案。

我的应用程序包含一个带有一堆vals中定义的静态数据的对象。数据包括类的实例。

我的问题是,当Android决定终止该活动并稍后重新启动时,我的对象会发生什么?我知道Scala中的对象可以用来实现与Java中静态值类似的目的,但实际上并没有在生成的字节码中实现。那么Android知道在重新启动活动时重新初始化我的对象吗?是否存在不会这样做的情况,或者我必须小心的情况?

如果上面的答案是“一切都很好”,我认为由可变数据组成的对象会有很大不同。在那种情况下,我非常确定我需要显式保存/恢复此类对象以保留状态。但是,保存/恢复始终相同且硬连接到APK本身的数据似乎很愚蠢。

1 个答案:

答案 0 :(得分:3)

简而言之,对象被转换为单例,单个实例保存在静态最终字段中。因此,对象将被重新初始化,并且您需要序列化来为可变对象恢复相同的数据。

Scala编程(来自Odersky等人),第31章,解释了如何使用反编译器来获得所需的答案 - 这很容易。

基本上,给定一个这样的对象:

object App {
 def main(args: Array[String]) {
  println("Hello, world!")
 }
}

它将被翻译为实现单例模式的名为App$的类。特别是,单例实例包含在定义为public static final App$ MODULE$ = new App$();的字段中,并且这些方法被定义为实例方法。 javap App$可用于确认字段的声明 - 可能jad也可以反编译源代码。如果没有定义伴随类,Scala还将定义一个名为App的类,其中包含从Java调用的相应静态final方法。这样,您可以使用正确的签名获得App.main方法,并可以调用scala Appjava App会使用正确的附加库调用{{1}}。