几天前,我发现单身人士可以在Android中成为反模式。我的单例(具有私有构造函数的类和存储在静态字段中的实例)被删除(尽管其他活动仍在使用此单例(通过getInstance()方法),因此实例已被删除,因此必须创建另一个实例)因为Activity从中首次调用被删除(仅在调用此活动完成后)。
我已经阅读过如何解决这个问题,但我也读过“Effective Java”。据说“单元素枚举类型是实现单例的麻烦方式”。
所以现在我想知道在Android应用程序中以这种方式创建的单例的生命周期是什么?它是否与“标准单例实现”的情况相同,所以在破坏第一次被销毁时调用它的活动后(即使它也用于其他活动)?
我不是在问关于正确的android单例实现还是单例模式本身(它是模式还是反模式等)但是我想知道这样的枚举单例对象的生命周期是什么以及何时会被销毁
答案 0 :(得分:2)
在所有情况下,您使用的类都与加载它们的ClassLoader
相关联。这在Java中通常都是如此,而不仅仅是Android。 Android会通过每次使用新的ClassLoader
来隔离活动 - 至少,它不会保证它不会,并且它尽我所知。
任何单例或其他类级别状态都与绑定到Class
的{{1}}绑定。这就是你的国家“消失”的原因;实际上,您的调用代码在新的ClassLoader
中看到了新的Class
。
因此,基于枚举的技巧或这些行中的任何其他技巧都具有完全相同的行为。你不能以这种方式“持久”活动信息。您可以而且应该写入SQLite DB。您也可以将其隐藏在ClassLoader
中。
答案 1 :(得分:0)
应用程序对象是存储需要可供各种活动或服务实例访问的信息的好位置。您可以像这样检索它(这是一个活动或服务):
私有MyApplication app;
onCreate(...)中的{ ... this.app =(MyApplication)this.getApplication(); ... }
请记住在清单中也设置名称: 设置“application”标记的属性“name”: 该值是相对于应用包的类的路径。
应用程序启动时创建应用程序对象,您可以像在onCreate()方法中的活动或服务中一样初始化。
要记住的一件事:应用程序对象可以在关闭“最后”活动后继续存在。在这种情况下,您可以使用之前与应用程序交互的状态获取相同的应用程序对象。如果这是一个问题,您必须以某种方式检测应用程序的初始启动(例如,使用不带UI的特殊启动器活动,初始化应用程序对象,然后启动新的意图。 顺便说一句,如果他们还没有丢失垃圾收集,单身人士也可能会这样做。
答案 2 :(得分:-2)
我的安全单例实现就是这样:
我创建了一个单例类,其属性为boolean'doveReceiveMemoryWarning';
public class SingleTon(){
public boolean didReceiveMemoryWarning = true;
...
...
}
在应用程序第一个屏幕(它正是第一个启动屏幕)(我有一个可见的闪屏3秒)
SingleTon.getInstance().didReceiveMemoryWarning = false;
在每个Activity的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};
}
}
这是我的实施。