11

試圖決定(爲我的應用程序)在onPause()中保存哪些內容以及如何保存onSaveInstanceState(),我梳理了整個SO的提示和明確的指導方針。「持久狀態」與「當前狀態」

如果我理解正確,onSaveInstanceState()最適合保存「運行時更改」或「當前狀態」(無論這意味着什麼),而onPause()最適合保存「持久狀態」(無論這意味着什麼)。

我仍然很難決定什麼在我的應用程序構成「持久狀態」與「當前狀態」。例如,儘管用戶首選項顯然是持久的,但是當用戶更改它們時,是否始終要通過Android UI框架自動保存它們,是否需要將它們保存在onPause()中?

是否需要將班級數據成員保存在onSaveInstanceState()?我是否需要在我的應用程序中爲類做到這一點?

我很困惑。

您能帶來真實世界的例子嗎?必須在onPause()中保存什麼以及必須在onSaveInstanceState()中保存哪些內容?用於設備配置更改的Except,即。

-

一些新的見解,後,我的問題已經有了答案:

  • 的onSaveInstanceState的Bundlenot written to anything,這是不持久的以任何方式。
  • onSaveInstanceState的Bundle數據將只是held in memory,直到應用程序關閉。
+0

「除了設備配置更改」......這是什麼意思? – 2012-08-08 23:36:52

+0

這與方向類型更改有關。 – 2012-08-08 23:42:27

+0

@AlexLockwood「Except」一詞是指它的意思。幾乎無聊的例子是方向類型的變化,但它可能是別的東西? (例如連接的USB鍵盤,建立的互聯網連接等) – ateiob 2012-08-09 00:57:41

回答

7

您不需要在onPause中存儲用戶偏好,因爲正如您所說,框架可以爲您做到這一點。

要區分持久數據和狀態信息,請考慮文本編輯器應用程序。

持久數據

假設用戶已經輸入了幾個單詞,然後退出應用程序。用戶並沒有明確告訴我們將這些數據保存到一個文件中,但是當它們返回時確實會很好地存儲這些數據。這是持久性數據,您想將其存儲在onPause()中。

狀態數據

同樣,說你有2個選項卡,並跟蹤哪個選項卡當前選擇的變量。這是您將存儲在onSaveInstanceState()中的狀態數據。

灰質

最後想象你在跟蹤在編輯器行的字符數和數量的編輯器有一個類。這是狀態數據,您可以將其存儲在onSaveInstanceState()中,或者可以將其丟棄並在重新啓動時重新計算它。不管你把它扔掉可能取決於計算需要多長時間,例如,如果你可以通過存儲數據來阻止網絡請求,那麼這樣做。

進一步的想法

通過與您的應用程序打,如果有,你沒有松鼠正確的數據遠的區域,應該是顯而易見的。請務必按照主屏幕按鈕的方式進行操作,然後從設備管理器中關閉您的應用。這可以讓你在你的應用程序關閉而不僅僅是暫停的情況下達到最佳效果。

如果您的UI狀態在整個生命週期事件中保持一致,並且您的用戶數據仍然存在,那就幹好了。

編輯基於評論

我認爲有2個在這裏的標準來確定何時/何保存。

第一個很主觀 - 你想保存數據嗎?確實沒有任何東西強迫你保存狀態或數據。會保存這些信息會帶來更好的用戶體驗嗎?如果您正在撰寫電子郵件並嘗試從其他應用複製/粘貼文本,則每次應用關閉時都會丟失半分類型的電子郵件,這將令人沮喪。

第二部分,確定要保存什麼取決於您是否可以根據您擁有的數據重建UI狀態。例如,如果您保存了文本數據,那麼這意味着用戶正在編輯文本。所以現在我們知道切換到編輯文本選項卡並填寫保存的文本。

一般來說,如果您希望將用戶返回到他們離開的相同位置,那麼您需要考慮恢復到該點所需的狀態數據。試想一下,你的應用程序

  • 的原始版本加載需要什麼樣的數據更改爲將其轉換成最後的狀態中,用戶 鋸?
  • 你需要存儲什麼數據才能回到這裏?

這實際上是Android的工作原理,您的活動被破壞並重新創建,並且您的工作是再次設置棋子(如果您選擇這樣做)。

+2

這正是我需要的答案類型,所以接受。儘管如此,爲了讓事情更清楚:爲什麼選擇的分類與用戶輸入的詞語不同?這是因爲鍵入的單詞是關鍵數據,而選擇的標籤是「很高興有」?這是決定持續狀態和狀態的標準嗎? (順便說一句,我看到編輯們一直保存選中的選項卡,即使在重啓之間也是如此)。 – ateiob 2012-08-09 01:10:00

+1

我認爲這裏有2條標準。第一個是非常主觀的 - 保存這些信息會帶來更好的用戶體驗嗎?如果您正在撰寫電子郵件並嘗試從其他應用複製/粘貼文本,則每次切換應用時都會丟失半分類的電子郵件,這將令人沮喪。第二部分是,您是否可以根據您擁有的數據重建UI狀態 - 如果您保存的文本數據必須表示用戶正在編輯文本,請切換到該選項卡並填寫保存的文本。 – 2012-08-09 01:12:40

+0

P.S.在'onPause()中保存日期只是故事的一半。取消或停止某些操作似乎是另一半,如[CookieSyncManager文檔](http://developer.android.com/reference/android/webkit/CookieSyncManager.html)中所示。或者這可以視爲存儲? – ateiob 2012-08-09 01:42:06

6

這裏是答案。你可以用三種不同的方式保存狀態。

1)子類化的應用程序(不是一個好主意)。 2)SharedPreferences(適用於簡單數據,快速可靠) 3)SQLite數據庫(更復雜,也更可靠)。

現在回答你的問題。 Android確實沒有任何保證。它在任何時候都可以並且可能會在不調用任何特定函數的情況下銷燬您的應用程序。所以如果有數據對於保存至關重要,那麼回答是只要您收到它就保存。如果您知道您將需要立即保存某些內容,通常沒有太多優勢可以保存。

onSaveInstanceState()僅用於保存與佈局或方向更改有關的臨時變量。

總之持久狀態/數據(應該生存崩潰),應保存儘快,不要等到onPause(),因爲沒有保證。這就是現實。

+0

很好的解釋。謝謝! (我要強調我相信的是關鍵技巧) – ateiob 2012-08-09 01:02:11

+0

很好的說明,但onPause保證在應用程序被殺之前調用......有邏輯語句,我們可以從 得出這個推論1.從不恢復的應用程序將被殺死android應用程序將進入非恢復(暫停狀態)只有當應用程序onPause被稱爲 請讓我知道如果我在這裏丟失的東西 – 2017-06-02 05:44:30

0

我遇到的情況是一款遊戲,我想將持久數據保存到遊戲服務器。

由於這可能需要一段時間,我發現嘗試並保存在中,而不是在onStop中保存的好東西。

據我也做了測試,onStop似乎能夠在後臺運行,而塊,至少是這樣的話,當我按家庭(有一個簡單的測試110m環路和onStop) 。 任何人都可以證實這個阻塞理論?

onStop需要Honeycomb向上(api11+),因爲在該版本之前,您可以在onClose被調用之前被殺死。

請參閱here並在表中尋找killable - 如果真實情況符合文檔是另一個問題:)。