2011-04-20 41 views
2

我有一堆用戶首選項保存在我的應用程序中的單例對象中。樣本模型看起來是這樣的 -Android活動生命週期問題:何時提交GlobalPreferences

public class UserContext { 
    public static final String WEBSRV_IP = "TRIMMED"; 
    public static UserContext instance; 
    // Contains username, password, if they're valid etc. 
    private LoginDataModel loginModel; 
    private ArrayList<FacilityDataModel> model; 
    private FilterDataModel filters; 

    private UserContext() 
    { 

    } 

    public UserContext getInstance() 
    { 
     if(instance == null) { 
      instance = new UserContext(); 
     } 
     return instance; 
    } 
    // Getters and setters 
} 

所以現在,當用戶經過申請,我有一堆創建的活動,通過他們的生命週期,利用這些變量和光潔度。 (例如,在onStart()方法中,我會在提交活動之前檢查用戶是否已登錄)。

我的問題是,Android文檔似乎建議我備份我的onPause()方法中的任何上下文相關數據。但是每次我自己創建一個新的Activity時,也會調用onPause(),並且似乎浪費了全部GlobalVariables,只有在下一個活動的onStart()方法中恢復它們。有沒有辦法確定整個應用程序是否已經進入了後臺?如果不是,你什麼時候保存了所有Globals?

謝謝,
Teja。

回答

1

我在優先級值來確定的時刻保存的偏好(與SharedPreferences.Editor.commit()),無論是由用戶或者由應用程序代碼。直到他們被確定爲有意義之後的某個時候,我還沒有遇到過拖延儲蓄偏好的情景。

+0

我也傾向於同意這一點,雖然我有經驗,當更新幾件事導致一點放緩。 – Maximus 2011-04-20 18:21:27

+0

啊。那麼這可能是我還沒有遇到的情景,這確實提出了不同的解決方案。是什麼導致了減速?許多價值觀是否一次堅持?有幾百或幾千個保存的值? – 2011-04-20 18:45:51

+0

數百是,數千。我應該再限定一點,那就是在發現SQLite數據庫更適合存儲長列表的事情之前。對於一般設置... SharedPreferences最有意義。 – Maximus 2011-04-20 19:15:01

1

我想每個應用程序的情況都會有所不同。如果您需要保存該活動的狀態,onPause()不是一個可惡的想法。如果用戶移動到另一個自己的活動,然後點擊主頁按鈕,該怎麼辦?您的應用程序將通過onStop()轉換爲停止狀態。如果他們重新啓動您的申請,則可能有合理的期望(可能)保留之前的狀態。

我保存它們時,它是有道理的保存它們。例如,我有一個SMS應用程序,我可以讓用戶保存最後發送的消息。點擊發送時,我保存它們的最後一條消息。我不會在onPause()或onStop()上做任何事情,但是當用戶期望它完成時,我會完成所有工作。

開發人員傳統上討厭if邏輯,但一個聰明的朋友總是提醒我,「if-logic在用戶的腦海中」。如果我這樣做,那麼這將發生......在我的情況;如果我發送消息,我的消息將被保存。

0

onPause()被調用並且onStop()不被調用的唯一時間...就是如果您的活動在其他僅僅部分遮擋它的活動下仍然可見。大多數情況下,onStop()也會被調用,如果你知道在你自己的活動結構中,你將永遠完全模糊其他活動,我會考慮保存onStop()並在onStart()中恢復。

還記得,一般來說,無論你保存在onPause()中的什麼都應該在onResume()中恢復。 onStart()中保存的內容應該可以在onStart()中恢復。如果發生onPause(),但onStop()不會... onStart()不會被調用。

我要補充,以及我與比爾莫特的說法,你應該保存的東西是有意義的時候。一旦你對活動生命週期框架有了充分的理解,你通常可以做出一個不錯的選擇。

+0

嗯,在iOS世界中與「應用程序」相比,在思考「活動」時遇到了麻煩。 – 2011-04-20 18:04:47

+0

我對iOS不熟悉,但想想它的方式是一個應用程序包含您在包中創建的所有活動。通常,雖然不總是,但您將在Manifest中聲明的其中一項活動爲主要啓動點(您將在該活動的中看到此內容)。 – Maximus 2011-04-20 18:31:08