在Android应用程序中使用静态类变量是否安全

时间:2013-05-24 22:55:10

标签: android

我知道扩展Application类以提供全局存储的技术。但是在我的情况下,我正在为库函数编写一个类,所以不要强迫该类的用户沿着这条路走。我需要一些静态类变量。我已经看到在StackOverflow中传递引用可能不安全。但是我尝试使用同一个类的两个不同的应用程序,即使在多窗口模式下在Galaxy S3上并行运行两个应用程序,静态类变量仍然是独立的。

因此,对Android内部人员有深入了解的人可以确认这是否安全。

如果它不安全,我可以将变量包装在嵌套类中,并使用应用程序包名称作为键将它们添加到Serializable静态HashMap中。这将迫使他们安全。但是,如果没有必要,那么我宁愿不去做。

4 个答案:

答案 0 :(得分:10)

  

我已经看到在StackOverflow中传递引用可能不安全。

如果您的流程会不时终止,那么它们就不会“安全”,从而消灭您的静态数据成员(以及您的自定义Application)。因此,静态数据成员对缓存很有用,而不是其他。

在该范围内,它们是“安全的”。

您只需确保将此数据存储在持久性(例如,文件)的某个位置,或者一旦该过程终止并稍后再次启动就可以重新生成。这与Application没有什么不同。

  

但是我尝试使用同一个类的两个不同的应用程序,即使在多窗口模式下在Galaxy S3上并行运行两个应用程序,静态类变量仍然是独立的。

正确。这些是单独的进程,具有类和对象的单独副本。

答案 1 :(得分:5)

如果您的目标是在应用程序生命周期的曲折中存储持久性数据,那么我建议不要使用静态变量来执行此操作。这种方法的明显问题是,当操作系统决定回收内存时(即当屏幕休眠或不同的应用程序启动内存密集型任务时),系统可以很容易地garbage collected。我不确定您要“存储”哪种数据,但我建议您将状态保存在SharedPreferencesSQLiteDatabase中。

答案 2 :(得分:1)

我对你要做的事感到有些困惑。您是否正在尝试使用Java创建一个实用程序库以供其他应用程序使用?您是否正在尝试创建一个供其他应用程序使用的整个活动?

无论如何,正如其他海报所提到的,当资源紧张时,应用程序几乎可以在任何时候被杀死。根本无法保证静态全局值将保留在内存中。您必须提供在 onPause() onSaveInstanceState()上备份的方法。

如果您正在编写实用程序库,我假设它返回一个保存其所有状态的主对象。将 saveState(Bundle) restoreState(Bundle)方法添加到该对象,并可选择 saveToSharedPreferences() restoreFromSharedPreferences()方法。

如果这是你正在写的一个活动,你可能已经熟悉了保存状态的方法。

我,我喜欢将“单身模式”与共享偏好结合起来:https://stackoverflow.com/a/13673178/338479

答案 3 :(得分:0)

您似乎对类的工作方式存在深刻的误解。

即使两个类在两个独立的应用程序中的同一个包中(默认情况下),这些应用程序也在不同的VM(即进程)上运行。它们实际上彼此无关(因为它应该是,否则你可能会遇到跨应用程序名称冲突,这是不可接受的)。

您正在寻找的是一种使用静态变量的方法,而是一种进行进程间通信(IPC)的方法。 Android的服务是理想的,尽管那里有一些陡峭的学习曲线。