在同一进程中运行的两个应用程序可以具有不同的STATIC对象值吗?

时间:2012-12-20 15:56:28

标签: android multithreading process

我创建了两个共享相同用户ID(sharedUserId)的Android应用程序以及相同的进程。 在第一个应用程序中,在启动时,我将静态int变量设置为1(默认值为0)。 在第二个应用程序中,我从另一个应用程序加载(使用反射)相同的类并读取静态int变量。我读了0。

由于两个应用程序都在同一个进程上运行,我希望它们共享相同的静态值,不是吗? 任何人都可以告诉我下面的机制是做什么的吗? (他们是否正在使用不同的apk / dex加载器并导致此行为?)

2 个答案:

答案 0 :(得分:1)

原来答案是这个.... 它与类加载器有关,是Java而不是进程或应用程序。

Java语言:类由其完全限定名称标识 Java虚拟机:类对象由其完全限定名称和定义类加载器

标识

由同一个类加载器加载的类的实例肯定会看到相同的静态变量。类加载器通常委托给它的父类加载器。如果父级已经加载了类,则不会再次加载它。可以通过编写自己的类加载器来更改此标准行为。结果是类加载器的层次结构只会加载一次类,因此分配静态变量并运行一次静态块。      但是,如果您有多个类加载器层次结构,则可以多次加载同一个类并多次分配静态成员。由不同类加载器定义的两个类对象是不同的类型,即使它们是从同一个类文件生成的。由同一个类加载器加载的类的实例看到相同的静态变量。一个很好的参考是Forman和Forman的Java Reflection in Action的第6章。

感谢Chris Matawa在这篇文章中给出了答案: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/8-b5T1zYr-8

答案 1 :(得分:0)

  

但是它们占用了两个资源,特别是在位图

使用静态变量在不同应用程序之间共享位图(甚至在同一应用程序的不同活动之间),在内存泄漏方面是个坏主意;请参阅http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/以获取示例。

使用静态变量在活动和应用程序之间共享数据和资源,而不是节约资源,这会使事情变得更糟,因为不仅所有这些东西都会永远存在于内存中(或者至少很长一段时间,即使你不这样做不再需要它们了)但是更多的是,由于隐藏和未知的引用,这些静态的东西可以带来许多其他东西。

这就是为什么你应该使用Intents,SharedPreferences或数据库传递数据,并为每个活动留下加载资源方面所需的内容。

一些需要时间加载的大资源有时可以在不同的活动之间共享,但是如果你不想泄漏大量内存,你需要格外小心。这在任何手机上都是珍贵的。