android应用程序类单例和全局变量

时间:2014-11-16 21:56:24

标签: android singleton global-variables

在查看有关单身人士,全局变量和扩展应用程序类的各种信息后,我想出了我认为可行的解决方案,但我想知道是否有理由不这样做。

我创建了一个类:

public class GlobalVariables {
    private static GlobalVariables instance;
    private static Boolean testVar;
    //other private static variables.

    //setters
    public void setTestVar(Boolean vAR)
    {
       GlobalVariables.testVar = vAR;
    }
    //other similar setters from private static variables above.

    //getters
    public Boolean getTestVar() {
        return GlobalVariables.testVar;
    }
    //other similar getters from private static variables above.

    public static synchronized GlobalVariables getInstatnce() {
        if(instance==null) {
            instance=new GlobalVariables();
        }
        return instance;
    }
}

在我的活动,服务,广播接收器......:

private GlobalVariables g = GlobalVariables.getInstance();

// getting the value
Boolean bVar = g.getTestVar();

// do somethings with bVar.
...

bVar = true;

// set GlobalVariables.testVar
g.setTestVar(bVar);

同样,有没有理由不使用它来在活动,服务,broadcastReceivers和其他任何类之间传递变量?

2 个答案:

答案 0 :(得分:3)

在Android上使用Singletons本身并不是什么坏事,the Android guide even suggests it as one way to share data between activities

但是,在Android框架中你应该非常小心的一件事是通过Singletons传递Context个项目。与您的应用程序本身不同,系统会因各种原因(显式活动破坏,内存不足或用户离开应用程序而)回收活动和碎片。但是,保持对这些上下文之一的引用的Singleton不会被销毁,这意味着您只是创建了一个可能的内存泄漏,因为该项目已不再用于系统并且已经创建了一个新项目。解决Context泄漏的一种方法是使用ApplicationContext,这是整个过程的Context,只有在整个过程(以及您的Singleton)被回收时才会被回收。在Singleton中使用ApplicationContext并没有什么坏处,尽管通常还有其他方法可以获得对Context的引用。

答案 1 :(得分:0)

是的,你应该避免在这种方法中传递信息,因为你很容易导致内存泄漏。为了在活动之间传递信息,你可以使用Intent附加功能。你应该在意图中加入额外的东西,从下一个活动中你得到额外的。 示例:How do I get extra data from intent on Android?