我创建了两个共享相同用户 ID (sharedUserId) 以及相同进程的 Android 应用程序。在第一个应用程序中,在启动时,我将静态 int 变量设置为 1(默认为 0)。在第二个应用程序中,我从另一个应用程序加载(使用反射)相同的类并读取静态 int 变量。我读了0。
由于两个应用程序在同一个进程上运行,我希望它们共享相同的静态值,不是吗?谁能告诉我下面的机制是做什么的?(他们是否使用了不同的 apk/dex 加载器并导致了这种行为?)
我创建了两个共享相同用户 ID (sharedUserId) 以及相同进程的 Android 应用程序。在第一个应用程序中,在启动时,我将静态 int 变量设置为 1(默认为 0)。在第二个应用程序中,我从另一个应用程序加载(使用反射)相同的类并读取静态 int 变量。我读了0。
由于两个应用程序在同一个进程上运行,我希望它们共享相同的静态值,不是吗?谁能告诉我下面的机制是做什么的?(他们是否使用了不同的 apk/dex 加载器并导致了这种行为?)
原来答案是这样......它与类加载器有关的是Java,而不是进程或应用程序。
Java 语言:类由其完全限定名标识 Java 虚拟机:类对象由其完全限定名和定义类加载器标识
由同一个类加载器加载的类的实例肯定会看到相同的静态变量。类加载器通常委托给它的父类加载器。如果父级已经加载了该类,它将不会再次加载它。可以通过编写自己的类加载器来更改此标准行为。结果是类加载器的层次结构只会加载一次类,因此分配静态变量并运行静态块一次。但是,如果您有多个类加载器层次结构,您可以多次加载同一个类并多次分配静态成员。由不同类加载器定义的两个类对象是不同的类型,即使它们是从同一个类文件生成的。由同一个类加载器加载的类的实例看到相同的静态变量。
感谢 Chris Matawa 在这篇文章中给我答案: https ://groups.google.com/forum/?fromgroups=#!topic/android-developers/8-b5T1zYr-8
但是它们占用了两个很多资源,尤其是在位图方面
就内存泄漏而言,使用静态变量在不同应用程序之间(甚至在同一应用程序的不同活动之间)共享位图将是一个坏主意;有关示例,请参见http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ 。
使用静态变量在活动和应用程序之间共享数据和资源不是节省资源,而是让事情变得更糟,因为不仅所有这些东西都会永远保留在内存中(或者至少很长一段时间,即使你不需要它们不再)但更重要的是,由于隐藏和未知的引用,这些静态的东西可以带来很多其他的东西。
这就是为什么您应该使用 Intents、SharedPreferences 或数据库传递数据,并让每个活动负责加载它在资源方面所需的内容。
一些需要时间加载的大资源有时可以在不同的活动之间共享,但是如果你不想泄露大量内存,你需要格外小心。这在任何手机上都是非常珍贵的。