【问题标题】:How to Declare Always-accessible Constants in Android?如何在 Android 中声明始终可访问的常量?
【发布时间】:2018-05-10 07:09:04
【问题描述】:

我对 Android 的生命周期有了一点了解。

如果操作系统面临资源短缺,即使是静态变量也会丢失,对吧? (Android static variables are lost)

例如,static final String 变量就像

public static final String OPTION = "option";

应用暂停时可能会丢失。

那么除了使用'strings.xml'之外,我如何声明可以在应用程序的生命周期中一直访问的常量,因为我无法静态访问该文件。

是否可以声明其值始终保持不变的变量?

【问题讨论】:

  • 在 Java 中,使用静态字符串常量的更好替代方法是使用枚举。它们提供比使用静态字符串更好的功能。
  • this的可能重复

标签: android


【解决方案1】:

您说得对,Android 操作系统可以随时终止您的应用进程,这可能导致 static 变量“丢失”。 但是,对于简单的常量,这不是问题。一旦您的应用程序再次启动,这些常量将被重新初始化并可供使用。所以像

public static final String MY_APP_NAME = "Stack Overflow";
public static final int VERSION_NUMBER = 1;

完全可以安全使用。当你有这样的静态变量时,你只会遇到操作系统杀死你的进程的麻烦:

public static MyObject;

其值可以在应用进程的整个生命周期内发生变化。

【讨论】:

  • 啊!非常感谢!
【解决方案2】:

您可以在 Application 类中设置 getter,条件是如果变量为 null,则从共享首选项中获取,否则从内存中返回。

此类变量的设置器也会将值设置为共享偏好。

public class MyApplication extends Application {

  private String var;

  public String getVar() {
     if(var == null){
         return getVarFromSP();
     }
     return var;
  }

  public void setVar(String s) {
       var = s;
       storeVarToSP(s);
  }
}

【讨论】:

    【解决方案3】:

    您可以创建一个扩展 Application 的单例类并将全局变量放在那里。除非应用程序关闭,否则可以从任何地方访问变量。

    例如

    public class MyApplication extends Application {
    
    public static final String OPTION = "option";
    
    }
    

    稍后在清单中添加类,

    <application
          android:name="MyApplication"
          android:allowBackup="true"
          android:icon="@mipmap/ic_launcher"
          android:label="@string/app_name"
          android:supportsRtl="true"
          android:theme="@style/AppTheme">
          ............
      </application>
    

    最后从任何活动中获取变量,

    String option = ((MyApplication) this.getApplication()).OPTION;
    

    String option = MyApplication.OPTION;
    

    在您的情况下,变量丢失了,因为在轮换或配置更改后,应用程序生命周期重新开始并重置所有预定义变量。

    更多信息请查看:Android global variable

    【讨论】:

    • 我们不能只使用String option = MyApplication.OPTION; 而不是String option = ((MyApplication) this.getApplication()).OPTION;
    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    相关资源
    最近更新 更多