我正在使用SearchCritiera对象并将其设为singleton并将此变量声明为static, 现在的问题是,如果我让我的应用程序保持打开状态几个小时,Android操作系统会删除静态对象,我怎样才能确保操作系统不会删除静态对象。
就像我知道像
这样的关键字很少周参考和软参考是否有任何strongreference关键字,可以告诉Android操作系统不删除引用?
答案 0 :(得分:3)
不要使用静态引用,即使你的应用程序仍在前台,垃圾收集器也可能会破坏这些对象(我现在已经看过几次)。
您可以通过将它们存储在唯一的Application实例中来避免这种情况。只要您的应用程序保证该对象能够存活。
答案 1 :(得分:1)
可悲的是,您无法强制Android将您的应用程序保留在内存中。如果操作系统认为它需要更多的内存用于前台应用程序或服务,它保留终止您的一个或所有活动的权利。
我假设正在发生的事情是你的静态对象在你调用时丢失并重新创建,这意味着它已经失去了它的状态。也就是说,如果你在前台Activity中引用了这个对象,我会有点惊讶它会迷失。
你可以解决这个问题的最好方法是挂钩the lifecycle events并保存你的单例对象的状态,然后在适当的时候恢复它。
不幸的是,Androd没有应用程序范围的生命周期事件。有关如何保存瞬态应用程序状态,请查看this question。
答案 2 :(得分:1)
如果我没有错,应用程序长时间保持打开数据由android OS发布,而stopiong活动它会调用“onSaveInstanceState”,什么时候可以将searchritiera存储到此方法中,并在“onRestoreInstanceState”时返回“被叫了?
private static SearchCriteria searchCriteria;
@Override
public void onSaveInstanceState(Bundle outState)
{
outState.putSerializable(WLConstants.SEARCH_CRITERIA, searchCriteria);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
if(savedInstanceState != null){
searchCriteria = (SearchCriteria)
savedInstanceState.getSerializable(WLConstants.SEARCH_CRITERIA);
}
super.onRestoreInstanceState(savedInstanceState);
}