几天前,我发现单例可以成为Android中的反模式。我的单例(具有私有构造函数的类和存储在静态字段中的实例)已被删除(实例被删除,尽管其他活动仍在使用此单例(通过getInstance()方法),因此必须创建另一个实例),因为最初从中调用它的活动已被删除(在仅为这一个活动调用finish之后)。
我已经读过如何解决这个问题了,不过我也刚刚读过"Effective“。有人说“单元素枚举类型是实现单例的最好方法”。
所以现在我想知道在Android应用程序中以这种方式创建的singleton的生命周期是什么?这是否与“标准单例实现”的情况相同,因此在销毁第一次调用它的活动后,它将被销毁(即使它也用于其他活动)?
我不是问合适的android单例实现或单例模式本身(是模式还是反模式等),但我想知道这种枚举单例对象的生命周期是什么,以及它何时会被销毁。
发布于 2011-12-30 21:47:54
在所有情况下,您使用的类都绑定到加载它们的ClassLoader
。一般来说,这在Java中是正确的,不仅仅是Android。安卓将通过每次使用新的ClassLoader
来隔离活动--至少,它不会保证不会这样做,而且据我所知,它确实做到了。
任何单例或其他类级别的状态都绑定到绑定到ClassLoader
的Class
。这就是你的状态“消失”的原因;实际上是你的调用代码在一个新的ClassLoader
中看到了一个新的Class
。
因此,您的基于枚举的技巧,或者任何其他类似的技巧,都将具有完全相同的行为。你就是不能以这种方式“持久化”活动信息。您可以也应该写入SQLite DB。你也可以把它藏在SharedPreferences
里。
发布于 2012-01-05 19:04:56
应用程序对象是存储各种活动或服务实例需要访问的信息的好位置。您可以像这样检索它(其中这是一个Activity或Service):
私有MyApplication应用程序;
在onCreate( ... ){ ...this.app = (MyApplication) this.getApplication();... }
记住也要在清单中设置名称:设置"application“标签的" name”属性:该值是类相对于应用程序包的路径。
应用程序对象是在应用程序启动时创建的,您可以像在活动或服务中一样在其onCreate()方法中进行初始化。
要记住的一件事是:应用程序对象可以在关闭“最后”活动后存活下来。在这种情况下,您可能会从之前与应用程序的交互中获得与状态相同的应用程序对象。如果这是一个问题,你必须以某种方式检测应用程序的初始启动(例如,使用一个没有UI的特殊启动程序活动,它初始化应用程序对象,然后启动一个新的意图。顺便说一句,如果单例还没有丢失到垃圾回收中,同样的情况也可能发生在单例中。
发布于 2011-12-30 21:32:59
我的安全单例实现是这样的:
我创建了一个单例类,它有一个布尔型属性'didReceiveMemoryWarning';
public class SingleTon(){
public boolean didReceiveMemoryWarning = true;
...
...
}
在应用程序的第一个屏幕(它正好是第一个启动屏幕)(我有一个3秒可见的闪屏)
SingleTon.getInstance().didReceiveMemoryWarning = false;
在每个活动的onCreate()方法中,检查这个布尔数据,
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(SingleTon.getInstance().didReceiveMemoryWarning){
{ Load your data from local to your SingleTon class,
because your app was released by OS};
}
}
这是我的实现。
https://stackoverflow.com/questions/8679894
复制相似问题