4

应用程序的 Android 文档指出:通常不需要子类化应用程序。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能[即维护全局应用程序状态]。如果您的单例需要全局上下文(例如注册广播接收器),则可以为检索它的函数提供一个 Context,该上下文在首次构造单例时在内部使用 Context.getApplicationContext()。

我的要求是:您能否解释一下,并提供代码示例来实现上述维护全局状态的建议。

请注意,已经有建议子类化 Application: How to declare global variables in Android?

谢谢你。

4

2 回答 2

7

更正 StinePike 关于 ApplicationState 中上下文的回答。在发布的代码中,传递给应用程序状态的上下文被保留。如果传入的上下文是一个活动或类似的单元,那么该活动将被泄漏并防止被垃圾收集。

Application 类的 android文档Context.getApplicationContext()声明您应该“在首次构建单例时在内部使用”。

public class ApplicationState {
    private Context applicationContext;
    private static ApplicationState instance;

    private ApplicationState(Context context) {
        this.applicationContext = context.getApplicationContext();
    }

    public static ApplicationState getInstance(Context context) {
        if(instance == null) {
            instance = new ApplicationState(context);
        }
        return instance;
    }
}
于 2013-10-18T19:00:07.803 回答
6

如果我没记错的话,您正在尝试保存全局变量而不扩展 Application. 如果是这样,你可以做两件事

如果你不需要任何上下文,那么你可以简单地使用一个像这样的静态成员的类

public class ApplicationState {
    public static boolean get() {
        return b;
    }

    public static void set(boolean a) {
        b = a;
    }

    private static boolean b;
}

如果您需要上下文但不想扩展应用程序,您可以使用

Public class ApplicationState {
    private Context context;
    private static ApplicationState instance;

    private ApplicationState(Context context) {
        this.context = context;


    public static ApplicationState getInstance(Context context) {
        if (instance == null) {
            instance = new ApplicationState(context);
        }
        return instance;
    }

    public void someMethod(){}
}

所以你可以调用一些这样的方法 ApplicationState.getInstance(context).somemethod();

于 2013-05-17T05:13:13.880 回答