Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

सेव इंस्टेंस स्टेट का उपयोग करके एंड्रॉइड एक्टिविटी स्टेट कैसे सेव करें?

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 में पहले से संभाला गया; अतिरिक्त लॉजिक के लिए यहां रखें यदि आवश्यक हो
    }
}

मुख्य बिंदु

  • onSaveInstanceState onStop से पहले कॉल किया जाता है (API 28+ पर onPause से पहले)।
  • बंडल सीरियलाइज़ किया गया है—इसे छोटा रखें (< 50KB अनुशंसित)।
  • onCreate(Bundle) को पुनर्स्थापना के लिए समान बंडल प्राप्त होता है; onRestoreInstanceState वैकल्पिक है और onStart के बाद चलता है।
  • ViewModel (आर्किटेक्चर कंपोनेंट्स) कॉन्फिगरेशन परिवर्तनों पर स्वचालित रूप से जीवित रहता है—UI स्थिति के लिए इसे प्राथमिकता दें।

ViewModel के साथ तुलना

पहलूonSaveInstanceStateViewModel
जीवित रहता है कॉन्फिग परिवर्तन परहां (सीरियलाइज़ेशन के माध्यम से)हां (मेमोरी में)
प्रक्रिया मृत्यु पर जीवित रहता हैहां (यदि बंडल छोटा है)नहीं (जब तक 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 को प्रक्रिया मृत्यु से बचाता है बिना मैन्युअल बंडल प्रबंधन के।

परीक्षण

  1. ऐप चलाएं, EditText में टेक्स्ट टाइप करें।
  2. डिवाइस घुमाएं → टेक्स्ट बना रहता है, TextView पुनर्स्थापित मान दिखाता है।
  3. डेवलपर विकल्प → "Don't keep activities" सक्षम करें → होम दबाएं → ऐप फिर से खोलें → स्थिति पुनर्स्थापित होती है।
  1. Android में पिछली एक्टिविटी पर वापस कैसे जाएं Android में पिछली एक्टिविटी पर वापस कैसे जाएं

    एक्टिविटी नेविगेशन यदि आप एक एक्टिविटी से दूसरी एक्टिविटी पर जाकर वापस आना चाहते हैं, तो आप finish() मेथड का उपयोग कर सकते हैं। प्रत्येक एक्टिविटी एक्टिविटी स्टैक में स्टोर होती है, इसलिए शीर्ष एक्टिविटी को बंद करने पर पिछली एक्टिविटी दिखती है। उदाहरण: दो एक्टिविटी के बीच नेविगेशन चरण 1: नया प्रो

  1. एंड्रॉइड में एक्टिविटी को कैसे रीस्टार्ट करें? एंड्रॉइड में एक्टिविटी को कैसे रीस्टार्ट करें?

    एंड्रॉइड एक्टिविटी को प्रोग्रामेटिकली रीस्टार्ट करना यह गाइड एक्टिविटी को रीस्टार्ट करने के विभिन्न तरीकों को दर्शाता है, जिसमें इंटेंट फ्लैग्स और रिक्रिएशन शामिल हैं। लेआउट (activity_main.xml) <RelativeLayout xmlns:android=https://schemas.android.com/apk/res/android android:layout_width=mat

  1. एंड्रॉइड में इंटेंट का उपयोग करके एक एक्टिविटी से दूसरी एक्टिविटी में ऑब्जेक्ट कैसे भेजें? एंड्रॉइड में इंटेंट का उपयोग करके एक एक्टिविटी से दूसरी एक्टिविटी में ऑब्जेक्ट कैसे भेजें?

    Serializable के साथ एक्टिविटीज के बीच ऑब्जेक्ट पास करना यह उदाहरण दर्शाता है कि Serializable इंटरफेस को लागू करके कस्टम ऑब्जेक्ट को इंटेंट के माध्यम से एक एक्टिविटी से दूसरी एक्टिविटी में कैसे भेजें। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project चुनें। चरण 2: मेन लेआउट में EditT