問題:savedInstanceState 是什么 怎么用
先說答案:
saveInstanceState 是一個 Bundle 對象模闲,它提供了一種在 Activity 實例被意外銷毀和重建時保存和恢復 Activity 狀態(tài)的方式琳状。
使用?savedInstanceState?的場景:
屏幕方向改變:
當設備旋轉時芜茵,Activity默認會被銷毀并重建幔托,savedInstanceState可以保存數(shù)據(jù),然后在新實例中恢復章贞。
內存回收:
系統(tǒng)為了回收資源可能會銷毀后臺Activity页响,savedInstanceState用于這種情況下保存狀態(tài)。
多窗口模式:
當用戶在多窗口模式下調整Activity大小鸟缕,可能會觸發(fā)重新創(chuàng)建Activity晶框。
怎么實現(xiàn)狀態(tài)保存和恢復:
保存狀態(tài)
重寫?onSaveInstanceState(Bundle outState)?方法,將需要保存的狀態(tài)信息以鍵值對形式放入?Bundle?中懂从。
@Override
protected void onSaveInstanceState(Bundle outState) {
? ? super.onSaveInstanceState(outState);
? ? // 保存用戶的當前狀態(tài)
? ? outState.putInt("SCORE", currentScore);
? ? outState.putString("PLAYER_NAME", playerName);
}
恢復狀態(tài)
在?onCreate(Bundle savedInstanceState)?或?onRestoreInstanceState(Bundle savedInstanceState)?中恢復狀態(tài)三妈。
@Override
protected void onCreate(Bundle savedInstanceState) {
? ? super.onCreate(savedInstanceState);
? ? //檢查我們是否正在重新創(chuàng)建以前銷毀的實例
? ? if (savedInstanceState != null) {
? ? ? ? // 從保存的狀態(tài)恢復成員的值
? ? ? ? currentScore = savedInstanceState.getInt("SCORE");
? ? ? ? playerName = savedInstanceState.getString("PLAYER_NAME");
? ? } else {
? ? ? ? // 可能使用新實例的默認值初始化成員
? ? }
}
注意點:
只有在?Activity?被系統(tǒng)銷毀并重建的情況下,savedInstanceState?才會非空莫绣。用戶主動退出?Activity?時畴蒲,例如按下返回鍵,通常不會調用?onSaveInstanceState对室,因為此時認為用戶可能不需要恢復之前的狀態(tài)模燥。
savedInstanceState?不適用于持久化數(shù)據(jù),它更適合用于短暫保存界面狀態(tài)掩宜。對于需要長期保存的數(shù)據(jù)蔫骂,應使用文件存儲、SharedPreferences?或數(shù)據(jù)庫等方式牺汤。
大量數(shù)據(jù)不宜存入?savedInstanceState辽旋,因為?Bundle?容量有限,存入過多數(shù)據(jù)可能會導致?TransactionTooLargeException?異常檐迟。對于大量數(shù)據(jù)的保存补胚,應該考慮其他持久化存儲方案。