2010-01-15 44 views
5

我有SearchCritiera對象,我把它變成單例並聲明這個變量爲靜態, 現在的問題是如果我離開我的應用程序保持打開幾個小時,靜態對象被Android OS刪除,我怎麼能確保操作系統不應該刪除靜態對象。Android強大的參考

像我知道有像

Weekreference和SoftReference的幾個關鍵字沒有任何strongreference關鍵字可以告訴Android操作系統不刪除引用?

回答

3

不要使用靜態引用,即使你的應用程序保持在前臺,這些對象可以被垃圾收集器被破壞(我已經看到了這個正在發生幾次)。

您可以通過將它們存儲在您獨特的Application實例中來避免這種情況。只要您的應用程序保持這個對象的生命。

1

不幸的是,你不能強迫Android將你的應用程序保存在內存中。如果操作系統認爲它需要更多內存用於前臺應用程序或服務,則它保留終止一項或全部活動的權利。

我假設發生了什麼事是你的靜態對象正在丟失,並重新創建時,你說它,這意味着它已經失去了它的狀態。這就是說,如果你有一個前景對象的引用Activity我有點驚訝,它正在迷失。

你可以做的最好的解決方法是掛入the lifecycle events並保存你的單例對象的狀態,然後在適當的時候恢復它。

不幸的是,Androd中沒有應用程序範圍的生命週期事件。有關如何保存瞬態應用程序狀態,請參閱this question

1

如果我沒有錯,當應用程序長時間保持打開狀態時,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); 
    }