onSaveInstanceState के साथ एक्टिविटी स्टेट सेव करना
जब सिस्टम कॉन्फिगरेशन परिवर्तन (घूर्णन, मल्टी-विंडो, भाषा परिवर्तन) के कारण एक्टिविटी को नष्ट करता है, तो यह onSaveInstanceState(Bundle) को कॉल करता है। आप इस बंडल में छोटे, पार्सल करने योग्य डेटा को सहेज सकते हैं और onCreate या onRestoreInstanceState में इसे पुनर्स्थापित कर सकते हैं।
कब उपयोग करें
- अस्थायी UI स्थिति: स्क्रॉल पोजीशन, टेक्स्ट इनपुट, चयन, टैब इंडेक्स।
- नहीं के लिए: बड़े डेटा, बिटमैप, डेटाबेस ऑब्जेक्ट्स — ViewModel, Room, या कैश का उपयोग करें।
पूर्ण उदाहरण
लेआउट (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp"
android:gravity="center">
<EditText
android:id="@+id/etInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="कुछ टाइप करें..."
android:textSize="18sp" />
<TextView
android:id="@+id/tvRestored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="पुनर्स्थापित: "
android:textSize="18sp" />
</LinearLayout>
गतिविधि (MainActivity.java)
package com.example.savestatedemo;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private static final String KEY_DRAFT = "draft_text";
private EditText etInput;
private TextView tvRestored;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etInput = findViewById(R.id.etInput);
tvRestored = findViewById(R.id.tvRestored);
if (savedInstanceState != null) {
String draft = savedInstanceState.getString(KEY_DRAFT, "");
etInput.setText(draft);
tvRestored.setText("पुनर्स्थापित: " + draft);
}
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_DRAFT, etInput.getText().toString());
}
// वैकल्पिक: onRestoreInstanceState में पुनर्स्थापित करें (onCreate के बाद कॉल किया जाता है)
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// onCreate में पहले से संभाला गया; अतिरिक्त लॉजिक के लिए यहां रखें यदि आवश्यक हो
}
}
मुख्य बिंदु
onSaveInstanceStateonStopसे पहले कॉल किया जाता है (API 28+ परonPauseसे पहले)।- बंडल सीरियलाइज़ किया गया है—इसे छोटा रखें (< 50KB अनुशंसित)।
onCreate(Bundle)को पुनर्स्थापना के लिए समान बंडल प्राप्त होता है;onRestoreInstanceStateवैकल्पिक है औरonStartके बाद चलता है।- ViewModel (आर्किटेक्चर कंपोनेंट्स) कॉन्फिगरेशन परिवर्तनों पर स्वचालित रूप से जीवित रहता है—UI स्थिति के लिए इसे प्राथमिकता दें।
ViewModel के साथ तुलना
| पहलू | onSaveInstanceState | ViewModel |
|---|---|---|
| जीवित रहता है कॉन्फिग परिवर्तन पर | हां (सीरियलाइज़ेशन के माध्यम से) | हां (मेमोरी में) |
| प्रक्रिया मृत्यु पर जीवित रहता है | हां (यदि बंडल छोटा है) | नहीं (जब तक SavedStateHandle उपयोग न किया जाए) |
| डेटा आकार सीमा | ~50KB (IPC सीमा) | कोई व्यावहारिक सीमा नहीं |
| उपयोग में आसानी | मैन्युअल पुट/गेट | स्वचालित, जीवनचक्र-जागरूक |
आधुनिक विकल्प: SavedStateHandle (ViewModel में)
public class MyViewModel extends ViewModel {
private final SavedStateHandle handle;
public MyViewModel(SavedStateHandle handle) { this.handle = handle; }
public String getDraft() { return handle.get("draft"); }
public void setDraft(String s) { handle.set("draft", s); }
}
यह ViewModel को प्रक्रिया मृत्यु से बचाता है बिना मैन्युअल बंडल प्रबंधन के।
परीक्षण
- ऐप चलाएं, EditText में टेक्स्ट टाइप करें।
- डिवाइस घुमाएं → टेक्स्ट बना रहता है, TextView पुनर्स्थापित मान दिखाता है।
- डेवलपर विकल्प → "Don't keep activities" सक्षम करें → होम दबाएं → ऐप फिर से खोलें → स्थिति पुनर्स्थापित होती है।