我有SearchCritiera對象,我把它變成單例並聲明這個變量爲靜態, 現在的問題是如果我離開我的應用程序保持打開幾個小時,靜態對象被Android OS刪除,我怎麼能確保操作系統不應該刪除靜態對象。Android強大的參考
像我知道有像
Weekreference和SoftReference的幾個關鍵字沒有任何strongreference關鍵字可以告訴Android操作系統不刪除引用?
我有SearchCritiera對象,我把它變成單例並聲明這個變量爲靜態, 現在的問題是如果我離開我的應用程序保持打開幾個小時,靜態對象被Android OS刪除,我怎麼能確保操作系統不應該刪除靜態對象。Android強大的參考
像我知道有像
Weekreference和SoftReference的幾個關鍵字沒有任何strongreference關鍵字可以告訴Android操作系統不刪除引用?
不要使用靜態引用,即使你的應用程序保持在前臺,這些對象可以被垃圾收集器被破壞(我已經看到了這個正在發生幾次)。
您可以通過將它們存儲在您獨特的Application實例中來避免這種情況。只要您的應用程序保持這個對象的生命。
不幸的是,你不能強迫Android將你的應用程序保存在內存中。如果操作系統認爲它需要更多內存用於前臺應用程序或服務,則它保留終止一項或全部活動的權利。
我假設發生了什麼事是你的靜態對象正在丟失,並重新創建時,你說它,這意味着它已經失去了它的狀態。這就是說,如果你有一個前景對象的引用Activity我有點驚訝,它正在迷失。
你可以做的最好的解決方法是掛入the lifecycle events並保存你的單例對象的狀態,然後在適當的時候恢復它。
不幸的是,Androd中沒有應用程序範圍的生命週期事件。有關如何保存瞬態應用程序狀態,請參閱this question。
如果我沒有錯,當應用程序長時間保持打開狀態時,android操作系統釋放數據,而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);
}