欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中保存Activity狀態(tài)的多種實現(xiàn)方式

 更新時間:2025年06月10日 08:28:29   作者:時小雨  
Android系統(tǒng)在運行過程中可能會因為內(nèi)存不足或其他原因?qū)е翧ctivity被銷毀并重新創(chuàng)建,此時保存Activity的狀態(tài)就顯得尤為重要,本文將詳細(xì)講解Android中保存Activity狀態(tài)的主要方法

在 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ù)

完整示例代碼

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)文章

最新評論