在Android中,静态变量是否真的是“全局”的(系统范围内)?

4
在开始之前,请注意避免重复:这里有很多关于静态变量何时清除以及其生命周期的问题。但这不是我在这里所问的。
如果我在PC上的程序中有一个静态变量,并启动两个不同的程序副本,那么每个程序副本通常会在自己的沙盒中运行,并具有其自己的静态变量私有值。因此,它们不是系统范围内全局的(不确定这里是否使用了正确的术语)。
在Android中是否存在多个“实例”(词语用得宽泛)的静态变量的情况?我认为不可能同时在不同的沙盒中并行运行多个Activity的副本(尽管我不确定这一点),但是ContentProviders、IntentServices或Android可能从其他进程随机实例化的任何其他类呢?
或者换句话说,如果我有一个带有静态变量的类,那么我能保证同一设备上同时存在的每个类实例都可以访问相同的静态变量值吗?

也许你可以在这种情况下使用SharedPreference,但不确定。 - Virthuss
@Virthuss 如果使用正确,SharedPreferences可能会起作用,但如果我理解正确,所有对SharedPreferences的写入都直接写入磁盘。考虑到大多数Android设备使用Flash存储器进行永久性存储,具有有限的写入循环次数,我希望尽可能避免磁盘使用(更不用说这是相当慢的了...)。 - Markus A.
2个回答

4
静态字段可供运行在同一进程中的所有类访问。如果服务、应用程序、广播接收器、内容提供程序或活动在单独的进程中运行,则它将具有不同的内存空间,因此无法看到来自其他进程的静态字段。您可以通过在AndroidManifest中指定其“android:process="string"”(例如http://developer.android.com/guide/topics/manifest/receiver-element.html)来强制组件在另一个进程中运行。

反过来也一样吗?也就是说,如果我明确指定一个进程,比如一个BroadcastReceiver,我能否依赖于这个事实:所有这个BroadcastReceiver的实例都能看到相同的静态变量? - Markus A.
是的。因为它们将在同一进程上运行,因此将具有共享内存空间。 - Roberto Artiles Astelarra
简单来说,要访问静态变量,你需要访问宣告它的类(例如:Class.StaticVariable)。如果你的广播接收器需要访问该类以访问变量,则应这样做。如果您需要在不同进程之间共享数据,请使用ContentProvider。 - Viswanath Lekshmanan
3
@MarkusA. 没有这样的东西,但请记住进程可能会被系统杀死,从而丢失其静态字段数据。因此,第二次 BroadcastReceiver 运行时,它可能没有之前保存在静态字段数据中的内容。 - Roberto Artiles Astelarra
好的,非常感谢。听起来很合理。你知道这个是否在文档中明确提到吗?它似乎总是被认为是显而易见的,但在编码时,假设看似显而易见的事情实际上发生了,很容易自食恶果。我已经遇到过很多情况,其中Android API也没有完全考虑周全,并且会在某些不常见的边缘情况下出现问题... - Markus A.
显示剩余2条评论

0
对于Android来说,我认为静态变量不是系统级别的,它只在应用程序实例中可用。假设Activity A实例化了一个静态变量,那么Activity B将能够使用该静态变量。Activity A和B属于同一个应用程序。只要应用程序没有关闭,静态变量就应该保持实例化状态。但是,一旦应用程序关闭,静态变量就会被销毁并需要重新实例化。请注意,我使用了术语“应用程序”而不是“活动”。
至于ContentProvider,Android通常会为该特定应用程序生成一个目录,用于存储应用程序创建的所有数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接