onRestart — Android में Activity जीवन चक्र की एक विधि, जिसे सिस्टम द्वारा Activity के Stopped अवस्था से Started अवस्था में लौटने से पहले बुलाया जाता है। onRestart संकेत देता है कि एक Activity, जो पहले किसी अन्य स्क्रीन द्वारा छिपाई गई थी या पृष्ठभूमि में छोटी कर दी गई थी, उपयोगकर्ता के लिए फिर से दृश्यमान हो रही है। onRestart में, डेवलपर पुराने डेटा को अपडेट करता है, सूचियों को पुनः लोड करता है और UI स्थिति को पुनर्स्थापित करता है जो Activity के अदृश्य रहने के दौरान बदल सकती थी। Google Android Vitals (2025) के अनुसार, onRestart का उपयोग करके डेटा अपडेट करने वाले ऐप्स स्क्रीन पर लौटने पर 25% कम गलत जानकारी प्रदर्शित करते हैं। Android Developers दस्तावेज़ीकरण onRestart को Activity के स्क्रीन पर फिर से प्रकट होने से पहले एक प्रारंभिक चरण के रूप में वर्णित करता है।
मुख्य बिंदु
onRestart — एक कॉलबैक विधि जिसे Android onStart से ठीक पहले बुलाता है जब कोई Activity अदृश्य Stopped अवस्था से वापस दृश्यमान होने पर लौटती है। यह विधि इस मायने में अद्वितीय है कि इसे केवल तभी बुलाया जाता है जब Activity पुनः दिखाई जाती है — इंस्टेंस के पहले निर्माण के दौरान, क्रम onCreate से शुरू होता है, onRestart को छोड़ते हुए। पूरा चक्र: onCreate → onStart → onResume (पहला लॉन्च) या onRestart → onStart → onResume (बाद का प्रदर्शन)।
Android सिस्टम के दृष्टिकोण से, onRestart एक अनुकूलन है जो Activity को अपनी वापसी के लिए तैयार होने देता है: रिपॉजिटरी से डेटा अपडेट करना, UI स्थिति को सिंक्रोनाइज़ करना, नेटवर्क कनेक्टिविटी की जाँच करना। onResume के विपरीत, जो हर बार Activity के फोकस प्राप्त करने पर बुलाया जाता है (डायलॉग या सिस्टम मेनू से लौटने पर भी), onRestart केवल पूर्ण छिपाने-और-वापसी चक्र के दौरान ट्रिगर होता है। यह onRestart को “भारी” अपडेट संचालन के लिए आदर्श स्थान बनाता है जो आंशिक फोकस हानि के दौरान आवश्यक नहीं होते हैं।
Android Activity जीवन चक्र विनिर्देश के अनुसार, onStop और onRestart के बीच का समय अंतराल कुछ सेकंड (उपयोगकर्ता ने जल्दी स्विच किया) से लेकर कई घंटे (ऐप पृष्ठभूमि में था और उपयोगकर्ता लौटा) तक हो सकता है। इस दौरान, दूरस्थ स्रोत (API, DB) में डेटा बदल सकता था, इसलिए onRestart ताज़गी की जाँच के लिए एक स्वाभाविक बिंदु है।
onRestart केवल तब बुलाया जाता है जब Activity Stopped अवस्था से लौटती है, जिसमें Activity onStop बुलाए जाने के बाद प्रवेश करती है। नीचे वे सभी परिदृश्य दिए गए हैं जो onRestart की ओर ले जाते हैं।
onRestart आह्वान के परिदृश्य:
onRestart कब नहीं बुलाया जाता: स्क्रीन रोटेशन के दौरान (Activity नष्ट हो जाती है और onCreate के माध्यम से पुनः बनाई जाती है), डायलॉग बॉक्स से लौटने पर (Activity onStop में नहीं जाती, केवल onPause → onResume), प्रक्रिया समाप्ति के दौरान (Activity पुनः बनाई जाती है)।
onRestart और onCreate Activity को पुनर्स्थापित करने के दो अलग-अलग दृष्टिकोण हैं। उनके बीच चुनाव इस बात पर निर्भर करता है कि Activity पूरी तरह से नष्ट हो गई थी या बस छिपा दी गई थी।
| विशेषता | onRestart | onCreate |
|---|---|---|
| कब बुलाया जाता है | Activity Stopped से लौटती है | Activity पहली बार बनाई जाती है या नष्ट होने के बाद |
| स्थिति संरक्षित | हाँ — ViewModel और फ़ील्ड जीवित हैं | नहीं — सब कुछ नए सिरे से बनाया जाता है |
| Bundle | पारित नहीं किया जाता | पारित किया जाता है (savedInstanceState) |
| विशिष्ट क्रियाएँ | डेटा अपडेट, UI रिफ्रेश | View आरंभीकरण, LiveData सदस्यता |
| कॉल आवृत्ति | हर बार लौटने पर | एक बार या नष्ट होने के बाद |
चयन नियम: View आरंभीकरण और LiveData/StateFlow सदस्यता onCreate में करें (या Fragment के लिए onViewCreated में)। डेटा अपडेट, सूची पुनः लोड करना और स्थिति जाँच — onRestart में। यदि डेटा ViewModel के माध्यम से लोड किया जाता है, तो onRestart बस ViewModel पर refresh() विधि को कॉल कर सकता है, और View एक रिएक्टिव स्ट्रीम के माध्यम से अपडेट किए गए डेटा की सदस्यता लेगा।
Google अनुशंसा करता है: onRestart में onCreate के तर्क को डुप्लिकेट न करें। ViewModel में refresh() विधियाँ निकालें जो वर्तमान डेटा लोड करती हैं, और उन्हें onRestart में कॉल करें। यह साफ MVVM आर्किटेक्चर को संरक्षित करता है और कोड डुप्लिकेशन को समाप्त करता है।
onRestart उन संचालनों के लिए आदर्श स्थान है जो हर बार स्क्रीन पर लौटने पर किए जाने चाहिए, लेकिन पहले खोलने पर आवश्यक नहीं होते हैं। यहाँ विशिष्ट परिदृश्य दिए गए हैं:
viewModel.refreshItems() कॉल करें।onRestart में क्या न करें: Views को पुनः आरंभ न करें — वे जीवित हैं क्योंकि Activity नष्ट नहीं हुई थी। LiveData की पुनः सदस्यता न लें — onCreate में सदस्यता अभी भी जीवित है। नए Fragments न बनाएँ — वे पहले से ही FragmentManager में हैं।
सबसे महत्वपूर्ण अपवाद: onRestart नहीं बुलाया जाता यदि ऐप प्रक्रिया सिस्टम द्वारा मार दी गई थी। यह एक महत्वपूर्ण बिंदु है जिसे डेवलपर अक्सर स्थिति पुनर्स्थापना के लिए onRestart पर भरोसा करते समय भूल जाते हैं।
प्रक्रिया समाप्ति के दौरान:
इससे कैसे बचें: हमेशा महत्वपूर्ण स्थिति को onSaveInstanceState(Bundle) में सहेजें (onStop से पहले बुलाया जाता है) या ViewModel में SavedStateHandle का उपयोग करें। onCreate में, savedInstanceState की जाँच करें: यदि यह null नहीं है, तो Bundle से स्थिति पुनर्स्थापित करें; यदि null है, तो नया डेटा लोड करें।
Google Android Vitals के अनुसार, पृष्ठभूमि में लंबे समय के बाद Activity में लगभग 7% वापसियाँ प्रक्रिया समाप्ति के बाद होती हैं। इसका मतलब है कि हर 15वीं Activity जिसे onRestart बुलाना चाहिए था, वास्तव में onCreate से गुज़रती है। इस परिदृश्य को अनदेखा करना “वापसी के बाद खाली स्क्रीन” बग्स के मुख्य कारणों में से एक है।
Activity संपादन स्क्रीन से लौटने के बाद कार्य सूची को अपडेट करने के लिए onRestart में viewModel.refreshTasks() को कॉल करती है।
class TaskListActivity : AppCompatActivity() {
private val viewModel: TaskViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_task_list)
viewModel.tasks.observe(this) { tasks ->
Log.d("TaskList", "${tasks.size} कार्य प्राप्त हुए")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: कार्य सूची अपडेट हो रही है")
viewModel.refreshTasks()
}
}
class TaskViewModel : ViewModel() {
private val _tasks = MutableLiveData<List<Task>>()
val tasks: LiveData<List<Task>> get() = _tasks
fun refreshTasks() {
viewModelScope.launch {
_tasks.value = TaskRepository().getAllTasks()
}
}
}
ViewModel.refreshTasks() रिपॉजिटरी से वर्तमान डेटा लोड करता है। LiveData स्वचालित रूप से Activity को डेटा परिवर्तनों के बारे में सूचित करता है — UI बिना अतिरिक्त कोड के अपडेट होता है। onRestart एक नई सदस्यता नहीं बनाता — यह पहले से ही onCreate में स्थापित की गई थी।
Activity वापसी पर टोकन वैधता की जाँच करती है और यदि आवश्यक हो तो लॉगिन पर पुनर्निर्देशित करती है।
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "लॉगिन स्क्रीन से लौटे") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "टोकन समाप्त — लॉगिन पर पुनर्निर्देशित")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
यदि उपयोगकर्ता ने ऐप को लंबे समय तक छोटा किया और टोकन समाप्त होने के बाद लौटा, तो onRestart उन्हें लॉगिन स्क्रीन पर पुनर्निर्देशित करेगा। यह समाप्त टोकन के साथ अनुरोध करने का प्रयास करते समय API त्रुटियों को रोकता है। ध्यान दें: जाँच onRestart में है, onResume में नहीं, डायलॉग से लौटने पर अनावश्यक जाँच से बचने के लिए।
Fragment डेटा अपडेट करने के लिए LifecycleObserver के माध्यम से onRestart का उपयोग करता है।
class FeedFragment : Fragment() {
private val viewModel: FeedViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESTART)
fun onRestart() {
Log.d("FeedFragment", "LifecycleObserver के माध्यम से onRestart")
viewModel.refreshFeed()
}
})
}
}
Fragment में onRestart को ओवरराइड करने के बजाय, LifecycleObserver का उपयोग किया जाता है — एक अधिक लचीला दृष्टिकोण जो बिना इनहेरिटेंस के जीवन चक्र ईवेंट तर्क जोड़ने की अनुमति देता है। ViewLifecycleOwner सुनिश्चित करता है कि observer View स्कोप के भीतर रहता है (यह onDestroyView से आगे नहीं रहता)।
अक्सर पूछे जाने वाले प्रश्न
onResume हर बार बुलाया जाता है जब Activity फोकस प्राप्त करती है — जिसमें डायलॉग या सिस्टम मेनू से लौटना भी शामिल है (Activity onStop में नहीं गई थी)। onRestart केवल Stopped अवस्था से लौटने पर बुलाया जाता है, जब Activity पूरी तरह से छिपी हुई थी। onRestart “भारी” अपडेट के लिए एक संकीर्ण घटना है, जबकि onResume हल्के संचालन (शीर्षक बदलना, समय अपडेट करना) के लिए है।
नहीं, नहीं किया जा सकता। onRestart onStop के साथ एक युग्मित विधि है: onRestart केवल तभी बुलाया जाता है जब Activity onStop से गुज़री हो। यदि Activity onStop में नहीं गई (जैसे, कोई डायलॉग बॉक्स खोला गया था), तो वापसी पर onRestart नहीं बुलाया जाता — केवल onResume।
एमुलेटर में Home (घर बटन) दबाएँ — Activity छोटी हो जाएगी और onStop प्राप्त करेगी। फिर हाल के ऐप्स या लॉन्चर के माध्यम से ऐप खोलें — Activity onRestart → onStart → onResume प्राप्त करेगी। डीबगिंग के लिए, onRestart में ब्रेकपॉइंट के साथ Debug या Activity टैग के साथ Log.d का उपयोग करें।
onRestart में एक अनकैच अपवाद Force Close का कारण बनेगा। सिस्टम जीवन चक्र कॉलबैक में अपवादों को नहीं पकड़ता। यदि onRestart ऐसे संचालन करता है जो अपवाद फेंक सकते हैं (बिना try-catch के नेटवर्क अनुरोध, null View के साथ काम करना), तो उन्हें try-catch में लपेटें।
नहीं। onRestart केवल जीवित Activities के लिए बुलाया जाता है जो Stopped अवस्था से लौट रही हैं। onRestart में isFinishing() हमेशा false होगा। isFinishing() की जाँच onPause (डेटा सहेजना) और onDestroy (पुनर्निर्माण को finish() से अलग करना) में समझ में आती है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें