2013-02-27 42 views
0

我開始閱讀有關活動生命週期回調和保存狀態的內容,並且有很多內容我不明白 - 我正在編寫一個Android應用程序,但我想問一些更一般的問題問題,而不是如何專門爲我目前的少數活動等,我想有一個更好的整體看法,這是如何工作的!活動生命週期方法和保存狀態

有多種方法兩組我已經看到了正在使用(我見過一兩個人,但不願進一步混淆自己...)

  • 的onPause,等的onResume,
  • 然後onSaveInstanceState。

他們和我們應該使用它們的環境之間有什麼區別?我發現一些海報使用正常生命週期回調之一的問題,並被告知使用onSaveInstanceState,所以我們何時應該實現onPause而不是onSaveInstanceState等等。有些帖子提到的方法只用於暫態,有人可以擴展嗎?

我已經看到狀態被用來表示略有不同的東西 - UI/View狀態和Activity狀態,兩者有什麼區別?
我也有點不確定它們是什麼意思的狀態,當我們保存狀態什麼樣的東西,我們正確地保存,任何人都可以給一些快速的例子(我不是指實際的代碼)? Android開發人員指南說,Android系統會自動處理這些內容,那麼我們應該關注什麼?由onCreate和onSaveInstanceState使用的Bundle對象只存儲簡單的值,那麼更復雜的對象和數組又如何呢?

感謝

回答

0
protected void onPause() 
protected void onSaveInstanceState (Bundle outState) 

只要看一眼它,onSaveInstanceState有一個包,你可以把你的事情,你需要它來保存。並把它放回onCreate(Bundle)或onRestoreInstanceState(Bundle); 文檔中的一些重要線路:

這個方法被調用之前的活動可能會被殺死,這樣,當它 回來在未來一段時間內,它可以恢復其狀態。不要 將此方法與活動生命週期回調混淆在一起,例如 onPause(),當活動被放置在 的背景或銷燬途中時,總是調用該方法,或者在銷燬之前調用onStop(),它是 。

0

嘗試使用此代碼來保存狀態

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    State s = new State(yourTextView.getText().toString()); 
    outState.putSerializable(State.STATE, s); 
    super.onSaveInstanceState(outState); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    State s = (State) savedInstanceState.getSerializable(State.STATE); 
    yourTextView.setText(s.getYourTextViewText()); 
} 
0

的Android可以摧毀你的活動,甚至在任何給定的時間殺死你的進程(不可能當它是對用戶可見,雖然:-)) 。當用戶返回活動時,應該再次顯示屏幕上顯示的數據/信息。

onSaveInstanceState回調允許你這樣做。

大多數視圖已自動爲您做這個。例如。 EditText中的當前文本,ListView的當前滾動位置等都會自動保存。

但是,有些東西不會自動保存給您。例如。 TextView中的當前文本,特定視圖的(更改後的)後臺可繪製。

假設您在用戶操作失敗後顯示錯誤消息。該錯誤消息然後顯示在TextField中,並且此TextField的背景變爲紅色(我只是把它放在這裏:-))。當用戶在顯示該錯誤時離開活動(例如按Home按鈕)時,活動被破壞,當用戶回到活動時,錯誤消息和紅色背景將不會再顯示。

這是onSaveInstanceState來救援。
您可以將String保存在那裏,包含錯誤消息。然後,在重新創建活動時,onCreateBundle savedInstanceState不爲空,您可以查詢該錯誤消息。如果此消息不爲空/空,請致電TextView上的setText以獲取錯誤消息,並將該TextView的背景設爲紅色。

+0

在錯誤消息示例中,它是否未保存,因爲它不是在onCreate期間添加的初始UI的一部分?因此,由於用戶交互(或其他)而對UI的任何更改都不會自動保存? – kemka 2013-02-27 17:53:11

+0

是的,確切地說。由於用戶交互而對用戶界面進行的某些更改將自動保存(例如,將文本輸入到EditText中)。但是在TextView上調用setText不會被保存,並且在View上調用setBackgroundxxx()也不會被保存。這就是您可以使用saved-instance-state來「修復」這個問題的地方。 – 2013-02-27 17:57:47