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

Ben*_*Ben 5 lifecycle android scala

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

我的应用程序包含一个对象,其中包含一些在val中定义的静态数据.数据包括类的实例.

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

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

Bla*_*ade 3

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

《Scala 编程》(来自 Odersky 等人),第 31 章,解释了如何使用反编译器来获得您需要的答案 - 这非常简单。

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

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

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