【问题标题】:Are static variable truly "global" (system-wide) in Android?Android中的静态变量真的是“全局的”(系统范围的)吗?
【发布时间】:2016-02-26 09:52:05
【问题描述】:

一开始的快速说明以避免错误的重复:这里有很多关于静态变量何时被清除以及它们存在多长时间的问题。这不是我在这里要问的。

如果我在 PC 上的程序中有一个静态变量,并且我启动了该程序的两个不同副本,那么每个副本通常将在其自己的沙箱中运行,并为其静态变量具有自己的私有值。因此,它们不是系统范围的全局(不确定这是否是一个好的术语)。

在 Android 中是否存在我可以拥有多个静态变量的“实例”(松散使用的词)的情况?我认为不可能让 Activity 的多个副本在不同的沙箱中并行运行(尽管我不确定),但是 ConentProviders、IntentServices 或任何其他 Android 可能从潜在的其他类中随机实例化的类怎么样?进程?

或者,换一种说法,如果我有一个带有静态变量的类,我是否保证同一设备上同时存在的每个类实例都可以访问完全相同的静态变量值?

【问题讨论】:

  • 也许你可以在这种情况下使用 SharedPreference,但不确定
  • @Virthuss SharedPreferences 可能会起作用(如果使用正确),但如果我理解正确,所有对 SharedPreferences 的写入都会直接(?)到磁盘。鉴于大多数 Android 设备使用闪存作为写入周期有限的永久存储,我想尽可能避免使用磁盘(更不用说它很慢......)。

标签: android global sandbox static-variables


【解决方案1】:

在同一进程中运行的所有类都可以访问静态字段。如果 Service、Application、BroadcastReceiver、ContentProvider 或 Activity 在单独的进程中运行,那么它将拥有不同的内存空间,因此不会看到来自其他进程的静态字段。您可以通过在 AndroidManisfest 中指定组件来强制组件在另一个进程上运行(例如 android:process="string" http://developer.android.com/guide/topics/manifest/receiver-element.html

【讨论】:

  • 反之亦然吗? IE。如果我专门指定了一个进程,例如为 BroadcastReceiver,我是否可以相信此 BroadcastReceiver 的所有实例都将看到相同的静态变量这一事实?
  • 是的。因为它们会在同一个进程上运行,因此会有一个共享的内存空间。
  • 因此,没有同一个进程的两个“实例”,或者一个进程在两个不同的沙箱中运行,或者android只是通过创建两个不同的进程来分割一个命名进程的负载同名(有点像线程池)?
  • 简单地说,用于访问静态变量。您应该有权访问声明它的类(例如:Class.StaticVariable)。如果您的 BroadCastReceiver 应该访问用于访问变量的类。如果需要在不同进程之间共享数据,请使用 contentProviders。
  • @MarkusA。没有这样的事情,但请记住,该进程可能会被系统杀死,从而丢失其静态字段数据。因此,BroadcastReceiver 第二次运行时可能之前没有保存在静态字段中的数据。
【解决方案2】:

对于 Android,我相信静态变量不是系统范围的。它仅在应用程序的实例中可用。所以假设Activity A实例化一个静态变量,Activity B就能使用该静态变量。 Activity A 和 B 属于同一个应用程序。只要应用程序没有关闭,静态变量就应该保持实例化。但是,只要应用程序关闭,静态变量就会被杀死,需要重新实例化。请注意,我使用了术语应用程序非活动

对于 ContentProvider,Android 通常会为该特定应用程序生成一个目录,用于存放应用程序创建的所有数据。

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 2020-11-25
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2015-11-27
    • 2012-05-14
    • 2014-10-25
    相关资源
    最近更新 更多