2010-04-20 52 views
6

因此,在我的應用程序中有一個用於創建新用戶的表單,其中包含有關用戶的相關詳細信息和信息。這裏沒有問題,只是當用戶離開活動時沒有按下確認按鈕就會發生什麼。Android - 生命週期和保存實例狀態問題

這就是我想做的事:

  1. 如果用戶按下後退按鈕,嘗試將所有數據保存到數據庫,並通知用戶。
  2. 如果活動被中斷(即通過電話),請將所有數據保存到臨時位置,以便當活動再次位於堆棧的頂部時,沒有任何東西看起來已經改變(但數據仍然沒有尚未保存到數據庫)。
  3. 如果活動在後臺處理時遇到更多資源,請執行與上述第2點相同的操作(即當活動再次啓動時,看起來沒有任何變化)。
  4. 如果整個應用程序再次啓動(通過再次單擊圖標),並且存在上述第2點或第3點的臨時數據,請導航到「創建用戶」活動並顯示數據,就好像沒有更改。

這裏是如何我目前正在試圖做到這一點:

  • 使用onDestroy()isFinishing()功能找到活動時被打死,覆蓋上述第1點(至,然後盡力挽救所有數據)。
  • 保存與onSaveInstanceState所有數據成束(以覆蓋上述第2點)
  • 是否與onSaveInstanceState創建的束生存活性被殺死更多的資源,因此,當其重新產生的先前的狀態可被檢索(如在點3以上)?
  • 不知道如何實現點4

任何幫助將大規模讚賞。

乾杯!

+0

你確定3和4嗎?當用戶離開很長時間時,系統重置任務堆棧和清除信息是系統的標準Android行爲,無論該活動是否被終止,因此用戶期望這一點。 也許一個比打擊系統更好的計劃是減少單個屏幕上不可保存的信息數量或重新設計流量,這樣一切都可以保存onPause() - 也許有一個屏幕來創建用戶與他們的名稱,只保存點擊「創建」按鈕,然後在第二個屏幕輸入詳細信息,所有這些都可以節省onPause()。 – 2010-04-20 17:07:53

+0

與點3和4我想我試圖複製消息應用程序時消息保存爲草稿。儘管只用用戶名和其他重要細節將信息切割成活動,但在其他頁面中使用其他選項似乎是有益的。謝謝。 – 2010-04-21 08:48:47

回答

4

我很短的時間,所以不能給出一個完整的詳細的答案,但簡而言之,這裏是我的建議。

  • 代替使用onDestroy(),請使用onPause()。這保證了被叫;根據生命週期的官方文檔,只有onPause()是有保證的。 onStop和onDestroy不是。
  • onSaveInstanceState和onPause類似。當應用程序離開前臺時它們都會被調用(即它進入潛在的被殺死危險區域),但與oSIS的區別在於它提供的臨時包。 onPause不提供任何數據存儲機制,但是如果您使用的數據庫比您已經有一個。根據文件,沒有一個被保證的命令先被呼叫。
  • 3點),這正是OSIS是爲
  • 4點)在數據庫中你可以做一個「臨時排」,即保存臨時數據,第1行,但只要保存正確做出,第1行得到消隱。然後在你的onCreate()中,檢查第1行是否有真實數據或是空的。(如果您的列不能爲空,則使用預先確定的佔位符值,這些值不會作爲正常使用的一部分出現)。
+2

根據'onSaveInstanceState()'的文檔對第二個項目符號進行小修改:「不能保證它是否會在'onPause()'之前或之後出現。」 – CommonsWare 2010-04-20 17:22:04

+0

編輯,感謝您的信息。 – 2010-04-20 18:40:46

+2

另請注意,如果活動正在完成(因爲用戶不會返回到該實例),則不會調用onSaveInstanceState(),並且您可以在onPause()中檢查isFinishing()。 – hackbod 2010-04-21 03:16:38

1

我建議您創建一個統一的機制來保存臨時狀態。你可以使用Android reference建議的任何機制代替Bundle

+0

由於某種原因,我沒有想到它是這樣的,被試圖使用捆綁包等盲目。這種方式我會完全控制,所以如果我覺得適合,應該很容易改變。 – 2010-04-21 08:40:01