我知道扩展Application类以提供全局存储的技术。但是在我的情况下,我正在为库函数编写一个类,所以不要强迫该类的用户沿着这条路走。我需要一些静态类变量。我已经看到在StackOverflow中传递引用可能不安全。但是我尝试使用同一个类的两个不同的应用程序,即使在多窗口模式下在Galaxy S3上并行运行两个应用程序,静态类变量仍然是独立的。
因此,对Android内部人员有深入了解的人可以确认这是否安全。
如果它不安全,我可以将变量包装在嵌套类中,并使用应用程序包名称作为键将它们添加到Serializable静态HashMap中。这将迫使他们安全。但是,如果没有必要,那么我宁愿不去做。
答案 0 :(得分:10)
我已经看到在StackOverflow中传递引用可能不安全。
如果您的流程会不时终止,那么它们就不会“安全”,从而消灭您的静态数据成员(以及您的自定义Application
)。因此,静态数据成员对缓存很有用,而不是其他。
在该范围内,它们是“安全的”。
您只需确保将此数据存储在持久性(例如,文件)的某个位置,或者一旦该过程终止并稍后再次启动就可以重新生成。这与Application
没有什么不同。
但是我尝试使用同一个类的两个不同的应用程序,即使在多窗口模式下在Galaxy S3上并行运行两个应用程序,静态类变量仍然是独立的。
正确。这些是单独的进程,具有类和对象的单独副本。
答案 1 :(得分:5)
如果您的目标是在应用程序生命周期的曲折中存储持久性数据,那么我建议不要使用静态变量来执行此操作。这种方法的明显问题是,当操作系统决定回收内存时(即当屏幕休眠或不同的应用程序启动内存密集型任务时),系统可以很容易地garbage collected。我不确定您要“存储”哪种数据,但我建议您将状态保存在SharedPreferences
或SQLiteDatabase
中。
答案 2 :(得分:1)
我对你要做的事感到有些困惑。您是否正在尝试使用Java创建一个实用程序库以供其他应用程序使用?您是否正在尝试创建一个供其他应用程序使用的整个活动?
无论如何,正如其他海报所提到的,当资源紧张时,应用程序几乎可以在任何时候被杀死。根本无法保证静态全局值将保留在内存中。您必须提供在 onPause()或 onSaveInstanceState()上备份的方法。
如果您正在编写实用程序库,我假设它返回一个保存其所有状态的主对象。将 saveState(Bundle), restoreState(Bundle)方法添加到该对象,并可选择 saveToSharedPreferences()和 restoreFromSharedPreferences()强>方法。
如果这是你正在写的一个活动,你可能已经熟悉了保存状态的方法。
我,我喜欢将“单身模式”与共享偏好结合起来:https://stackoverflow.com/a/13673178/338479
答案 3 :(得分:0)
您似乎对类的工作方式存在深刻的误解。
即使两个类在两个独立的应用程序中的同一个包中(默认情况下),这些应用程序也在不同的VM(即进程)上运行。它们实际上彼此无关(因为它应该是,否则你可能会遇到跨应用程序名称冲突,这是不可接受的)。
您正在寻找的是不一种使用静态变量的方法,而是一种进行进程间通信(IPC)的方法。 Android的服务是理想的,尽管那里有一些陡峭的学习曲线。