onResume एंड्रॉइड जीवनचक्र की एक विधि है जो तब कॉल की जाती है जब Activity या Fragment अग्रभाग में आता है और इनपुट फ़ोकस प्राप्त करता है। इस अवस्था में, स्क्रीन उपयोगकर्ता के साथ बातचीत के लिए तैयार होती है: सभी स्पर्श ईवेंट, कुंजी प्रेस और जेस्चर इस घटक को निर्देशित किए जाते हैं। onResume Activity की कार्यशील अवस्था है, जहाँ एप्लिकेशन अपना अधिकांश समय बिताता है। यहीं पर कैमरा खोला जाता है, वीडियो प्लेबैक शुरू किया जाता है, वाक् पहचान शुरू की जाती है, और सेंसर श्रोता पंजीकृत किए जाते हैं जिन्हें विशेष पहुँच की आवश्यकता होती है। पूर्ण Activity जीवनचक्र के बारे में अधिक जानकारी के लिए, लेख पढ़ें Activity Lifecycle.
मुख्य बिंदु
onResume — Activity जीवनचक्र की तीसरी विधि, onStart के बाद कॉल की जाती है, जो संकेत देती है कि स्क्रीन उपयोगकर्ता के साथ पूर्ण बातचीत के लिए तैयार है। इस क्षण में, Activity बैक स्टैक के शीर्ष पर होती है, सिस्टम उसे सभी इनपुट ईवेंट निर्देशित करता है, और एप्लिकेशन उपयोगकर्ता की सक्रिय भागीदारी की आवश्यकता वाले किसी भी संचालन को शुरू कर सकता है: वीडियो कॉल, गेम, ऑडियो रिकॉर्डिंग, Canvas पर ड्राइंग।
onResume “अग्रभाग जीवनकाल” (foreground lifetime) का हिस्सा है — onResume और onPause के बीच का अंतराल। यह Activity की सबसे सक्रिय अवधि है, जब एप्लिकेशन सबसे अधिक संसाधनों का उपभोग करता है: स्पर्श प्रसंस्करण के लिए CPU, एनिमेशन रेंडरिंग के लिए GPU, वीडियो कैप्चर के लिए कैमरा और माइक्रोफ़ोन। जीवनचक्र के इस स्तर को समझना ऊर्जा खपत के अनुकूलन के लिए महत्वपूर्ण है — onResume में खोले गए संसाधनों को onPause में तुरंत बंद किया जाना चाहिए।
Google I/O 2025 के अनुसार, प्रति सत्र Activity द्वारा onResume अवस्था में बिताया गया औसत समय समाचार एप्लिकेशन के लिए 2–5 मिनट और गेम और मैसेजिंग ऐप के लिए 15–30 मिनट है। शेष समय Activity onPause, onStop या onDestroy अवस्थाओं में होती है। इसका मतलब है कि विशेष रूप से onResume कोड को अनुकूलित करने से प्रदर्शन और बैटरी जीवन में सबसे बड़ा लाभ मिलता है।
Activity में, onResume विधि हर बार कॉल की जाती है जब स्क्रीन इनपुट फ़ोकस प्राप्त करती है — पहली बार लॉन्च करने पर, दूसरी Activity से वापस आने पर, डायलॉग बंद करने पर, डिवाइस अनलॉक करने पर। यह एक “हॉट” विधि है जिसे प्रति सत्र कई बार कॉल किया जा सकता है, और इसका कार्यान्वयन जितना संभव हो उतना हल्का होना चाहिए।
class CameraActivity : AppCompatActivity() {
private var cameraProvider: ProcessCameraProvider? = null
private var preview: Preview? = null
override fun onResume() {
super.onResume()
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
preview = Preview.Builder().build().also {
it.setSurfaceProvider(binding?.viewFinder?.surfaceProvider)
}
try {
cameraProvider?.unbindAll()
cameraProvider?.bindToLifecycle(
this, cameraSelector, preview
)
} catch (e: Exception) {
Log.e("Camera", "Failed to bind camera", e)
}
}, ContextCompact.getMainExecutor(this))
}
override fun onPause() {
super.onPause()
cameraProvider?.unbindAll()
preview = null
}
}
CameraX उदाहरण onResume/onPause के क्लासिक उपयोग को दर्शाता है: कैमरा एक विशेष संसाधन है जिसे एक समय में केवल एक एप्लिकेशन उपयोग कर सकता है। bindToLifecycle के माध्यम से कैमरे को जीवनचक्र से बांधना onPause में कैमरे को स्वचालित रूप से बंद कर देता है, लेकिन स्पष्ट unbindAll कॉल तत्काल मुक्ति की गारंटी देता है। यह विशेष रूप से Activities के बीच स्विच करते समय महत्वपूर्ण है: कैमरे को दूसरी Activity द्वारा खोलने का प्रयास करने से पहले मुक्त किया जाना चाहिए।
Fragment में onResume उस Activity के onResume प्राप्त करने के बाद कॉल किया जाता है जिसमें वह शामिल है। हालांकि, FragmentManager और ViewPager की विशेषताओं के कारण, Fragment के लिए onResume कॉल का समय Activity के सापेक्ष विलंबित हो सकता है। उदाहरण के लिए, offscreenPageLimit = 1 वाले ViewPager में Fragment को onResume तभी मिलता है जब वह वर्तमान पृष्ठ बनता है, Activity शुरू होने पर नहीं।
class VideoPlayerFragment : Fragment() {
private var exoPlayer: ExoPlayer? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
exoPlayer = ExoPlayer.Builder(requireContext()).build()
binding?.playerView?.player = exoPlayer
}
override fun onResume() {
super.onResume()
exoPlayer?.play()
if (userVisibleHint) {
startBiometricAuth()
}
}
override fun onPause() {
exoPlayer?.pause()
stopBiometricAuth()
super.onPause()
}
}
Fragment.onResume में userVisibleHint जाँच ViewPager के लिए प्रासंगिक है: Fragment को onResume मिल सकता है लेकिन वह पड़ोसी पृष्ठ द्वारा छिपा हो सकता है (उदाहरण के लिए, एनिमेटेड संक्रमण के दौरान)। ऐसे मामलों में, दृश्यता जाँच के बिना onResume में वीडियो या बायोमेट्रिक्स शुरू करने से अप्रत्याशित व्यवहार होगा। Fragment 1.5.0 से, ViewPager2 में फ़्रैगमेंट जीवनचक्र के सटीक नियंत्रण के लिए FragmentTransaction.setMaxLifecycle() का उपयोग करने की अनुशंसा की जाती है।
डेवलपर्स अक्सर onStart और onResume को भ्रमित करते हैं, कोड को गलत विधि में रखते हैं। मुख्य नियम: onStart — उन संसाधनों के लिए जो दृश्यता के दौरान काम करते हैं; onResume — उन संसाधनों के लिए जिन्हें इनपुट फ़ोकस की आवश्यकता होती है। आइए विशिष्ट परिदृश्यों और सही विधि चयन को देखें।
| संक्रिया | विधि | तर्क |
|---|---|---|
| भौगोलिक स्थान सदस्यता | onStart / onStop | GPS आंशिक दृश्यता पर काम कर सकता है |
| कैमरा खोलना | onResume / onPause | कैमरा एक विशेष संसाधन है |
| BroadcastReceiver | onStart / onStop | सिस्टम ईवेंट को फ़ोकस की आवश्यकता नहीं है |
| वीडियो प्लेबैक | onResume / onPause | वीडियो उपयोगकर्ता को दिखाई देना चाहिए |
| Bluetooth स्कैनिंग | onStart / onStop | स्कैनिंग पृष्ठभूमि में चल सकती है |
| वॉयस रिकॉर्डर (MediaRecorder) | onResume / onPause | रिकॉर्डिंग के लिए सक्रिय UI आवश्यक है |
| सेंसर श्रोता | onResume / onPause | गेम और जेस्चर के लिए सेंसर |
| डेटा अद्यतन | onStart | प्रकट होने पर ताज़ा डेटा आवश्यक |
एक व्यावहारिक नियम: यदि कोई संक्रिया डायलॉग प्रकट होने पर बाधित होनी चाहिए — onResume/onPause का उपयोग करें। यदि कोई संक्रिया स्क्रीन के आंशिक रूप से ढके होने पर जारी रह सकती है — onStart/onStop का उपयोग करें। उदाहरण के लिए, वीडियो प्लेयर को डायलॉग खुलने पर वीडियो रोकना चाहिए (onPause), जबकि भौगोलिक स्थान अद्यतन जारी रख सकता है (onStart में रहता है)।
विशेष संसाधन डिवाइस के ऐसे घटक हैं जिनका उपयोग एक समय में केवल एक एप्लिकेशन कर सकता है। कैमरा, माइक्रोफ़ोन, वीडियो आउटपुट (MediaProjection), रीड मोड में NFC एडाप्टर, एक्सेसरी मोड में USB डिवाइस — इन सभी संसाधनों को onResume में खोला जाना चाहिए और onPause में मुक्त किया जाना चाहिए।
MediaRecorder का उपयोग ऑडियो और वीडियो रिकॉर्ड करने के लिए किया जाता है। अनुमति अनुरोध और MediaRecorder की तैयारी onCreate में की जाती है, जबकि रिकॉर्डिंग onResume में शुरू होती है। यदि उपयोगकर्ता किसी अन्य एप्लिकेशन पर स्विच करता है, तो onPause रिकॉर्डिंग रोकता है, और onResume इसे फिर से शुरू करता है। यह वॉयस रिकॉर्डर और वीडियो रिकॉर्डिंग एप्लिकेशन के लिए मानक व्यवहार है।
private var mediaRecorder: MediaRecorder? = null
private var isRecording = false
override fun onResume() {
super.onResume()
if (isRecording) {
mediaRecorder?.resume()
}
}
override fun onPause() {
if (isRecording) {
mediaRecorder?.pause()
}
super.onPause()
}
बायोमेट्रिक प्रमाणीकरण (BiometricPrompt) को केवल तभी कॉल किया जाना चाहिए जब Activity onResume में हो। यदि इसे onCreate या onStart में कॉल किया जाता है, तो बायोमेट्री डायलॉग Activity के आरंभीकरण पूरा करने से पहले प्रकट हो सकता है, जिससे परिणाम का गलत प्रसंस्करण हो सकता है। onResume में कॉल करना सुनिश्चित करता है कि बायोमेट्री विंडो सही संदर्भ में दिखाई जाए।
आइए वाणिज्यिक परियोजनाओं में उपयोग किए जाने वाले onResume के साथ कार्य करने के तीन सिद्ध पैटर्न देखें: निष्क्रियता टाइमर रीसेट, दृश्य डेटा अद्यतन, और Jetpack Navigation के साथ एकीकरण।
संवेदनशील डेटा वाले एप्लिकेशन (बैंकिंग, मेडिकल रिकॉर्ड) में, onResume का उपयोग स्वचालित लॉगआउट टाइमर रीसेट करने के लिए किया जाता है। यदि उपयोगकर्ता सक्रिय रूप से एप्लिकेशन के साथ बातचीत कर रहा है, तो onResume प्रत्येक स्क्रीन संक्रमण पर कॉल किया जाता है, और टाइमर रीसेट हो जाता है। यदि उपयोगकर्ता एप्लिकेशन को छोटा करता है, तो onPause टाइमर रोक देता है, और वापस लौटने पर onResume या तो इसे रीसेट करता है या पुनः प्रमाणीकरण का अनुरोध करता है।
एक सूची जो हर बार स्क्रीन पर वापस आने पर अद्यतन डेटा प्रदर्शित करनी चाहिए, onResume में अद्यतन की जाती है। उदाहरण के लिए, यदि उपयोगकर्ता ने किसी अन्य Activity में एक नई प्रविष्टि बनाई और वापस नेविगेट किया, तो onResume स्थानीय डेटाबेस या ViewModel कैश से सूची पुनः लोड करता है। यह मैन्युअल notifyDataSetChanged कॉल के बिना डेटा स्थिरता सुनिश्चित करता है।
override fun onResume() {
super.onResume()
// ActivityResultLauncher ने परिणाम लौटाया — सूची अद्यतन कर रहा है
viewModel.refreshList()
// निष्क्रियता टाइमर रीसेट
inactivityTimer.reset()
}
Jetpack Navigation में, फ़्रैगमेंट का onResume हर बार कॉल किया जाता है जब आप बैक नेविगेशन के माध्यम से उस पर लौटते हैं। इस गुण का उपयोग UI स्थिति रीसेट करने के लिए किया जाता है: कीबोर्ड छिपाना, खोज फ़ील्ड साफ़ करना, टूलबार शीर्षक अद्यतन करना। OnBackPressedCallback onResume के साथ संयोजन में कोड दोहराव के बिना नेविगेशन पर पूर्ण नियंत्रण देता है।
अक्सर पूछे जाने वाले प्रश्न
onStart — स्क्रीन दिखाई देती है। onResume — स्क्रीन सक्रिय और बातचीत के लिए तैयार है। कल्पना करें: आप टीवी देख रहे हैं (onStart), लेकिन आप रिमोट उठाते हैं (onResume)। टीवी हमेशा दिखाई देता है, लेकिन बातचीत केवल रिमोट से शुरू होती है। यदि कोई टीवी को पर्दे से ढक देता है — स्क्रीन दिखाई देना बंद हो जाती है (onStop)। यदि कोई आपसे रिमोट ले लेता है — बातचीत बंद हो जाती है (onPause), लेकिन टीवी अभी भी दिखाई देता है।
onResume हर बार कॉल किया जाता है जब Activity इनपुट फ़ोकस प्राप्त करती है। न्यूनतम एक बार (लॉन्च पर)। अधिकतम उपयोग परिदृश्यों पर निर्भर करता है: स्क्रीन के बीच स्विच करना, डायलॉग खोलना, डिवाइस को तेज़ी से लॉक और अनलॉक करना — ऐसा प्रत्येक परिदृश्य स्क्रीन पर वापस आने पर onResume कॉल करता है।
कैमरा एक विशेष संसाधन है जो एक समय में केवल एक एप्लिकेशन के लिए उपलब्ध है। यदि आप onCreate या onStart में कैमरा खोलते हैं, तो यह अन्य एप्लिकेशन के लिए तब भी लॉक रहेगा जब आपका एप्लिकेशन निष्क्रिय हो। onResume गारंटी देता है कि कैमरा केवल तभी खुला है जब Activity अग्रभाग में है, और onPause इसे तुरंत बंद कर देता है। यह एंड्रॉइड विकास का एक मानक है, जो CameraX और Camera2 API दस्तावेज़ीकरण में स्थापित है।
हाँ, onResume नहीं हो सकता है यदि किसी Activity को प्रकट होने के तुरंत बाद दूसरी Activity द्वारा ढक दिया जाता है। उदाहरण के लिए, Activity A, onCreate या onStart विधि में Activity B शुरू करती है। इस मामले में, A को onStart → onPause → onStop प्राप्त होता है, onResume को छोड़ते हुए। सिस्टम onResume कॉल नहीं करता क्योंकि Activity A को कभी इनपुट फ़ोकस नहीं मिला।
onResume में, लंबी सिंक्रोनस संक्रियाएँ नहीं करनी चाहिए: नेटवर्क से बड़ा डेटा लोड करना, जटिल SQL क्वेरी, इमेज प्रोसेसिंग। onResume UI थ्रेड पर चलता है, और 100–200 मिलीसेकंड से अधिक का कोई भी ब्लॉकिंग इंटरफ़ेस प्रतिक्रिया में देरी का कारण बनता है। सभी भारी संक्रियाएँ एसिंक्रोनस होनी चाहिए — coroutines, RxJava या WorkManager के माध्यम से। बिना जाँच के onResume में finish() कॉल करने की भी अनुशंसा नहीं की जाती है — इससे पुनर्निर्माण का अनंत लूप हो सकता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें