繁体   English   中英

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

[英]Can two applications that run in the same process have different STATIC object values?

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

由于两个应用程序都在同一进程上运行,因此我希望它们共享相同的静态值,不是吗? 谁能告诉我下面的机制是什么? (他们是否使用了不同的apk / dex加载器,这会导致这种现象?)

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

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

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

感谢克里斯·马塔瓦(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/

使用静态变量来在活动和应用程序之间共享数据和资源而不是节省资源,这会使情况变得更糟,因为不仅所有这些东西都将永久保留在内存中(或至少保留很长时间,即使您不需要它们也是如此)。甚至更多),由于隐藏和未知的引用,这些静态事物还可以带来很多其他事物。

这就是为什么您应该使用Intent,SharedPreferences或数据库传递数据,并让每个活动都根据资源来加载所需内容的原因。

有时需要花费大量时间来加载一些大型资源,这些资源可以在不同的活动之间共享,但是,如果您不想浪费大量内存,则需要格外小心。 这在任何移动设备上都是非常宝贵的。

暂无
暂无

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

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