Android中保存Activity狀態(tài)的多種實現(xiàn)方式
在 Android 中,保存 Activity 的狀態(tài)主要通過以下方式實現(xiàn):
1. 使用 onSaveInstanceState() 保存臨時狀態(tài)
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // 保存簡單數(shù)據(jù)類型 outState.putString("KEY_TEXT", editText.getText().toString()); outState.putInt("KEY_SCORE", currentScore); }
2. 在 onCreate() 或 onRestoreInstanceState() 中恢復(fù)狀態(tài)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState != null) { // 恢復(fù)數(shù)據(jù) String savedText = savedInstanceState.getString("KEY_TEXT"); int savedScore = savedInstanceState.getInt("KEY_SCORE", 0); editText.setText(savedText); currentScore = savedScore; } } // 或?qū)iT使用恢復(fù)方法 @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); String savedText = savedInstanceState.getString("KEY_TEXT"); // ... 恢復(fù)操作 }
3. 永久性數(shù)據(jù)存儲(推薦方案)
對于需要持久化的數(shù)據(jù)(如用戶設(shè)置),使用其他存儲方式:
- SharedPreferences(輕量級鍵值對)
// 保存 SharedPreferences prefs = getPreferences(MODE_PRIVATE); prefs.edit().putInt("HIGH_SCORE", 100).apply(); // 讀取 int highScore = prefs.getInt("HIGH_SCORE", 0);
- 本地數(shù)據(jù)庫(Room 等)
- 文件存儲
4. 處理 ViewModel + onSaveInstanceState
結(jié)合架構(gòu)組件處理配置變更:
// ViewModel 保存非界面數(shù)據(jù) public class MyViewModel extends ViewModel { public LiveData<List<User>> users; // ... } // Activity 中 viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
重要注意事項:
onSaveInstanceState()
適用場景:- 僅保存瞬態(tài)界面狀態(tài)(如輸入框文本、滾動位置)
- 不適合保存大量數(shù)據(jù)(如 Bitmap)或持久化數(shù)據(jù)
- 在 Activity 被系統(tǒng)銷毀重建時觸發(fā)(如屏幕旋轉(zhuǎn)、內(nèi)存不足)
- 數(shù)據(jù)生命周期:
- 最佳實踐:
- 簡單數(shù)據(jù):用
Bundle
- 復(fù)雜/持久數(shù)據(jù):用
ViewModel
+ 持久化存儲(Room/SharedPreferences) - 避免在 Bundle 中保存超過 50KB 數(shù)據(jù)
- 簡單數(shù)據(jù):用
完整示例代碼
public class MainActivity extends AppCompatActivity { private EditText editText; private int score; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = findViewById(R.id.editText); // 恢復(fù)保存的狀態(tài) if (savedInstanceState != null) { editText.setText(savedInstanceState.getString("SAVED_TEXT")); score = savedInstanceState.getInt("SCORE", 0); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("SAVED_TEXT", editText.getText().toString()); outState.putInt("SCORE", score); } // 可選:專門恢復(fù)方法 @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // 系統(tǒng)會自動恢復(fù)View狀態(tài)(如EditText文本) } }
其他技巧:
- 自動保存 View 狀態(tài):Android 默認(rèn)會保存所有具有 ID 的 View 狀態(tài)(如
EditText
內(nèi)容) - 禁用狀態(tài)保存:在 View 上設(shè)置
android:saveEnabled="false"
- 處理 Fragment 狀態(tài):在 Fragment 中同樣使用
onSaveInstanceState()
提示:對于配置變更(如屏幕旋轉(zhuǎn)),建議使用 ViewModel + LiveData 方案,它能更優(yōu)雅地保留數(shù)據(jù),避免頻繁保存/恢復(fù)操作。
以上就是Android中保存Activity狀態(tài)的多種實現(xiàn)方式的詳細(xì)內(nèi)容,更多關(guān)于Android保存Activity狀態(tài)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android LeakCanary檢測內(nèi)存泄露原理
這篇文章主要介紹了分析LeakCanary檢測內(nèi)存泄露原理,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下2021-03-03Android中AsyncTask與handler用法實例分析
這篇文章主要介紹了Android中AsyncTask與handler用法,以實例形式較為詳細(xì)的分析了Android中AsyncTask與handler的功能、用法與相關(guān)注意事項,并附帶完整實例源碼供讀者下載,需要的朋友可以參考下2015-10-10Android 取得狀態(tài)欄、任務(wù)欄高度的小例子
Android 取得狀態(tài)欄、任務(wù)欄高度的小例子,需要的朋友可以參考一下2013-05-05Android判斷touch事件點是否在view范圍內(nèi)的方法
這篇文章主要介紹了Android判斷touch事件點是否在view范圍內(nèi)的方法,涉及Android事件響應(yīng)與view屬性操作的相關(guān)技巧,需要的朋友可以參考下2016-03-03Android編程實現(xiàn)向SD卡寫入數(shù)據(jù)的方法
這篇文章主要介紹了Android編程實現(xiàn)向SD卡寫入數(shù)據(jù)的方法,涉及Android針對SD卡狀態(tài)判斷,文件及權(quán)限操作等相關(guān)技巧,需要的朋友可以參考下2016-04-04Android應(yīng)用中制作選中后圖標(biāo)變大浮動效果的代碼分享
這篇文章主要介紹了Android應(yīng)用中制作選中后圖標(biāo)變大浮動效果的代碼分享,這里作者舉了一個體育賽事app的例子,需要的朋友可以參考下2016-02-02Android string-array數(shù)據(jù)源簡單使用
這篇文章主要介紹了Android string-array數(shù)據(jù)源簡單使用的相關(guān)資料,需要的朋友可以參考下2016-09-09Android串口開發(fā)之使用JNI實現(xiàn)ANDROID和串口通信詳解
這篇文章主要給大家介紹了關(guān)于Android串口開發(fā)之使用JNI實現(xiàn)ANDROID和串口通信的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01