OnStart () और onResume () के बीच अंतर


176

मुझे onStart()संक्रमण की स्थिति का अर्थ नहीं मिल रहा है । onResume()विधि हमेशा के बाद कहा जाता है onStart()। इसे छोड़कर और विधियों onResume()को लागू करने के बाद इसे लागू क्यों नहीं किया जा सकता है ? इसका उद्देश्य क्या है?onRestart()onCreate()onStart()

हम बिना क्यों नहीं रह सकते onStart()। मैं अब भी इसे बेमानी मानता हूं (शायद इसलिए इसका अर्थ पूरी तरह से नहीं समझा है)।


आवेदन जीवन चक्र के लिए यहां देखें: d.android.com/guide/topics/fundamentals.html
ykatchou

यह सामान आसान है। Fragments के साथ इसे समझाने का प्रयास करें, अब यह आपके लिए Android प्रोग्रामिंग है!
स्कॉट बिग्स

नीचे दिए गए उत्तरों में स्पष्टीकरण के साथ वास्तविक कोड नहीं है। यह कोड है जो इसे खंड के साथ समझाता है।
अतुल

जवाबों:


306

ऐसा क्यों नहीं हो सकता है onResume () onRestart () और onCreate () के तरीकों को लागू करने के बाद सिर्फ onStart () को छोड़कर है? इसका उद्देश्य क्या है?

ठीक है, जैसा कि मेरा पहला उत्तर बहुत लंबा था, मैं इसे आगे नहीं बढ़ाऊंगा, तो चलिए यह कोशिश करते हैं ...

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

कृपया ध्यान दें: मैंने जानबूझकर कॉल super.onCreate(...)आदि चीजों को छोड़ दिया है । यह छद्म कोड है इसलिए मुझे यहां कुछ कलात्मक लाइसेंस दें। ;)

DriveToWorkActivityअनुसरण करने के तरीके ...

protected void onCreate(...) {
    openGarageDoor();
    unlockCarAndGetIn();
    closeCarDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

protected void onStart() {
    startEngine();
    changeRadioStation();
    switchOnLightsIfNeeded();
    switchOnWipersIfNeeded();
}

protected void onResume() {
    applyFootbrake();
    releaseHandbrake();
    putCarInGear();
    drive();
}

protected void onPause() {
    putCarInNeutral();
    applyHandbrake();
}

protected void onStop() {
    switchEveryThingOff();
    turnOffEngine();
    removeSeatBeltAndGetOutOfCar();
    lockCar();
}

protected void onDestroy() {
    enterOfficeBuilding();
}

protected void onReachedGroceryStore(...) {
    Intent i = new Intent(ACTION_GET_GROCERIES, ...,  this, GroceryStoreActivity.class);
}

protected void onRestart() {
    unlockCarAndGetIn();
    closeDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

ठीक है, इसलिए यह एक और लंबा है (क्षमा करें दोस्तों)। लेकिन यहाँ मेरा स्पष्टीकरण है ...

onResume()जब मैं गाड़ी चलाना शुरू करता हूं और onPause()जब मैं अस्थायी ठहराव पर आता हूं। तो मैं ड्राइव करता हूं फिर एक लाल बत्ती तक पहुंचता हूं इसलिए मैं रुकता हूं ... रोशनी हरी हो जाती है और मैं फिर से शुरू हो जाता है। एक और लाल बत्ती और मैं विराम, फिर हरा तो मैं फिर से शुरू। onPause() -> onResume() -> onPause() -> onResume()पाश एक तंग एक है और अपनी यात्रा के माध्यम से कई बार होता है।

लूप को पुनः आरंभ (मेरी यात्रा पर ले जाने की तैयारी) के माध्यम से फिर से शुरू करने से रोकना शायद कम आम है। एक मामले में, मैं किराने की दुकान को देखता हूं और GroceryStoreActivityशुरू किया जाता है (मेरी DriveToWorkActivityबात पर मजबूर होना onStop())। जब मैं स्टोर से लौटता हूं, तो मैं गुजरता हूं onRestart()और onStart()फिर अपनी यात्रा फिर से शुरू करता हूं।

मैं उस कोड को डाल सकता हूं जो onStart()दोनों में है onCreate()और सभी onRestart()को ओवरराइड करने के लिए परेशान नहीं onStart()करता है, लेकिन जितना अधिक इसके बीच onCreate() -> onResume()और onRestart() -> onResume(), जितना अधिक मैं चीजों को दोहरा रहा हूं उतना ही करने की आवश्यकता है ।

तो, एक बार और आवश्यकता के लिए ...

ऐसा क्यों नहीं हो सकता है onResume () onRestart () और onCreate () के तरीकों को लागू करने के बाद सिर्फ onStart () को छोड़कर है?

यदि आप ओवरराइड नहीं करते हैं onStart()तो यह प्रभावी रूप से होता है। हालाँकि, onStart()विधि को Activityसंक्षेप में कहा जाएगा, आपके कोड में प्रभाव प्रभावी रूप से है onCreate() -> onResume()या onRestart() -> onResume()


यह दोनों कि निकलता है onCreate()और onRestart()आम कोड का एक बहुत कुछ है, है ना का हिस्सा हैं?
धीरज वेपकोमा

1
@ धीरज: नहीं, जरूरी नहीं। यह छद्म कोड है और इसका मतलब केवल यह बताना है कि Activityजीवन-चक्र के प्रत्येक चरण का उपयोग कैसे किया जा सकता है। सृजन चरण onCreate(...)अच्छी तरह से एक बड़ा सौदा कर सकता है जब यह इंस्टेंटिंग उदाहरण के सदस्यों (यूआई तत्वों आदि) की बात आती है, लेकिन एक 'पुनः आरंभ' को ऐसा करने की आवश्यकता नहीं होनी चाहिए। वास्तव में कई Activitiesको वास्तव में इससे अधिक लागू करने की आवश्यकता नहीं होती है onCreate(...), onResume()और onPause()अन्य तरीके उन मामलों के लिए उपलब्ध होते हैं जहां आपको अन्य चीजें करने की आवश्यकता होती है और कुंजी को समझना होता है कि कोड कहां रखा जाए।
स्क्वॉन्क

1
यही कारण है कि मैं iOS और यहां तक ​​कि WP7 की तुलना में एंड्रॉइड एपीआई से नफरत करने के लिए आया हूं ... Ive एक ऐसा गेम बना रहा है जो C # तीनों पर चलता है और मुझे कहना है कि मैं Google और Android से निराश हूं। उन्हें भाषा / एपीआई डिजाइन विभाग की कमी लगती है। मुझे उम्मीद है कि कुछ अन्य लिनक्स फोन ओएस पर कब्जा होगा,
क्यूज़

2
@ टिम: ठीक है, एक बेहतर डिजाइन के साथ आते हैं। जब आप कोई ऐप (आपके ऐप) का उपयोग कर रहे हैं और आप अचानक एक फोन कॉल प्राप्त करते हैं, तो आप मोबाइल फोन पर एक परिदृश्य से कैसे निपटेंगे? एप्लिकेशन डिजाइनर स्पष्ट रूप से Activityजीवन-चक्र विधियों को कॉल नहीं करता है - यह एंड्रॉइड ओएस है जो इसे करता है और यह बहुत कुशलता से करता है (ऐप डेवलपर को पता है कि वे क्या कर रहे हैं और कुशलता से कोड भी करते हैं)। यदि आप बहुत सारे Android विकास करते हैं, तो आप महसूस करेंगे कि चीजें किस तरह से काम करती हैं - यह 100% सही नहीं है, लेकिन यह बहुत अच्छा है।
स्क्वॉन्क

9
मुझे लगता है कि निलेश का जवाब बहुत स्पष्ट है। के बीच मुख्य अंतर onStartऔर onResume'दृश्यता' और 'उपयोगकर्ता बातचीत' का है। यह ड्राइविंग-इन-कार रूपक भ्रामक है और वास्तव में सहायक नहीं है।
केजे

142

संक्षिप्त जवाब:

हम onStart के बिना नहीं रह सकते क्योंकि यह वह अवस्था है जब गतिविधि उपयोगकर्ता के लिए "दृश्यमान" हो जाती है, लेकिन उपयोगकर्ता इसके साथ "इंटरैक्ट" नहीं कर सकता है, फिर भी इसका कारण यह हो सकता है कि यह किसी अन्य छोटे संवाद के साथ ओवरलैप किया गया हो। उपयोगकर्ता के साथ बातचीत करने की यह क्षमता वह है जो onStart और onResume को अलग करती है। इसे एक कांच के दरवाजे के पीछे के व्यक्ति के रूप में सोचें। आप उस व्यक्ति को देख सकते हैं लेकिन आप उसके साथ बातचीत (बात / सुनना / हाथ मिलाना) नहीं कर सकते। OnResume दरवाजा खोलने वाले की तरह है जिसके बाद आप बातचीत शुरू कर सकते हैं।

इसके अतिरिक्त OnRestart () सबसे कम समझा जाने वाला एक है। हम सवाल पूछ सकते हैं कि क्यों नहीं सीधे onStart () या onResume () onStop () के बजाय onRestart () के बाद जाना चाहिए। यह समझना आसान हो जाता है यदि हम ध्यान दें कि onRestart () आंशिक रूप से onCreate () के बराबर है यदि निर्माण भाग छोड़ दिया गया है। मूल रूप से दोनों राज्य onStart () (यानी गतिविधि दिखाई देती है) का नेतृत्व करते हैं। इसलिए दोनों राज्यों को प्रदर्शित किए जाने वाले सामान को "तैयार" करना होगा। OnCreate में प्रदर्शित की जाने वाली सामग्री को "बनाने" की अतिरिक्त जिम्मेदारी है

इसलिए उनकी कोड संरचना कुछ इस तरह फिट हो सकती है:

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

संपूर्ण भ्रम तब होता है जब Google ने कुछ के बजाय गैर-सहज नाम चुने हैं:

onCreateAndPrepareToDisplay()   [instead of onCreate() ]
onPrepareToDisplay()            [instead of onRestart() ]
onVisible()                     [instead of onStart() ]
onBeginInteraction()            [instead of onResume() ]
onPauseInteraction()            [instead of onPause() ]
onInvisible()                   [instead of onStop]
onDestroy()                     [no change] 

गतिविधि आरेख की व्याख्या इस प्रकार की जा सकती है:

Android गतिविधि जीवनचक्र


4
जब मैं इसे छात्रों को समझाता हूं, तो मैं onStop () के बजाय शायद ifOnInv अदृश्य () का उपयोग करता हूं। और onDestroy () के बजाय शायद ifOnDestroy () का उपयोग करें। ये नाम मेरे द्वारा समझाई गई व्याख्याओं के अनुसार काम करते हैं। सोचा, मैं नहीं चाहूंगा कि Google वास्तव में इन नामों को बदले।
Stephan Branczyk

मुझे आपके सुझाए गए नाम पसंद हैं, वे हास्यास्पद एंड्रॉइड एपीआई के इस हिस्से का कुछ अर्थ बनाने में मदद करते हैं । मेरे पास अभी भी जीवनचक्र के बारे में एक सवाल है। सभी आरेखों में यह दिखाता है कि ऑनपॉइंट से सीधे ऑनस्क्यू पर एक रास्ता है। मुझे नहीं लगता कि मैंने कभी भी उस रास्ते को देखा है जो वास्तव में किसी भी मामले में अनुसरण करता है। यह हमेशा onStop से onStart तक का रास्ता लेता है। दूसरे रास्ते को क्या ट्रिगर करेगा?
डेवी वोजेल

@StephanBranczyk आप का उपयोग क्यों हो सकता है ... ()? शायद क्यों"?
मैरियन पाडज़िओच

1
@Damnum, गतिविधि जीवनचक्र के सबसे हालिया स्पष्टीकरण के लिए, मेरा सुझाव है कि आप Google द्वारा बनाए गए इंटरमीडिएट एंड्रायड उडनेस कोर्स की जाँच करें। यह मुफ़्त है, यह मानते हुए कि आप निशुल्क अपनी सामग्री तक पहुँचने के लिए नीले बटन पर क्लिक करते हैं, न कि ट्रायल बटन (न ही नैनोडेग्री बटन)। udacity.com/course/developing-android-apps--ud853
Stephan Branczyk

1
@Damnum, मैं आपको सुझाव दूंगा कि आप जिस वीडियो को देखते हैं, उससे संबंधित udacity फोरम में यह सवाल पूछें। लेकिन मूल रूप से, मुझे लगता है कि यह प्रयोग किए जा रहे संवाद पर निर्भर करता है, चाहे वह संवाद गतिविधि हो, या केवल संवाद।
स्टीफ़न ब्रांज़की 21

29

onStart()जब गतिविधि उपयोगकर्ता के लिए दृश्यमान हो रही हो तो उसे कॉल किया जाता है। onResume()कहा जाता है जब गतिविधि उपयोगकर्ता के साथ बातचीत करना शुरू कर देगी। आप इस मामले में अलग-अलग काम करना चाह सकते हैं।

संदर्भ के लिए यह लिंक देखें ।



10

"हैलो, एंड्रॉइड, गूगल के मोबाइल डेवलपमेंट प्लेटफॉर्म का परिचय" पुस्तक एंड्रॉइड ऐप्स के जीवन चक्र का एक अच्छा विवरण देती है। सौभाग्य से वे एक अंश के रूप में ऑनलाइन विशेष अध्याय है। Http://media.pragprog.com/tmarks/eband3/concepts.pdf पर 39 पृष्ठ पर ग्राफिक देखें

वैसे, यह पुस्तक एंड्रॉइड शुरुआती के लिए अत्यधिक अनुशंसित है!


2
अच्छी छवि और अच्छी किताब है, लेकिन फिर भी यह एक जवाब नहीं देता है कि हमें वास्तव में onStart () पद्धति की आवश्यकता क्यों है और हम इसमें क्या विशेष चीजें कर सकते हैं जो हम onResume () में नहीं कर सकते।
यूजीन

8
यदि एप्लिकेशन को रोक दिया गया था, तो onStart () को नहीं बुलाया जाता है। यदि आपका ऐप किसी अन्य ऐप पर ध्यान केंद्रित करता है, लेकिन आपका ऐप पूरी तरह से अस्पष्ट नहीं है, तो आपका ऐप "रुका हुआ" है। इसलिए आप "रुके हुए" राज्य की तुलना में "रुके हुए" राज्य में अलग-अलग काम कर सकते हैं। इस प्रकार, आप अलग-अलग काम कर सकते हैं यदि आपका ऐप रुके हुए राज्य से सिर्फ "फिर से शुरू" किया जाता है, तो आप यह करेंगे कि यदि आपका ऐप बंद राज्य से या पूरी तरह से शुरू हो गया है। क्या उससे मदद हुई?
मार्टिन बुका वेसर

7

एक विशेष रूप से feisty उदाहरण तब होता है जब आप किसी गतिविधि का उपयोग करके प्रबंधित संवाद दिखाने का निर्णय लेते हैं showDialog()। यदि उपयोगकर्ता स्क्रीन को घुमाता है, जबकि संवाद अभी भी खुला है (हम इसे "कॉन्फ़िगरेशन परिवर्तन" कहते हैं), तो मुख्य गतिविधि सभी समाप्त होने वाली जीवनचक्र कॉलों के माध्यम से onDestroy()जाएगी, जिसे फिर से बनाया जाएगा, फिर से बनाया जाएगा और जीवनचक्र के माध्यम से वापस जाना होगा। आप फिर भी क्या उम्मीद नहीं है, वह यह है कि onCreateDialog()और onPrepareDialog()(तरीकों कि कहा जाता है जब आप करते हैं showDialog()और अब फिर से स्वचालित रूप से संवाद करने के लिए पुन: - स्वचालित रूप से, क्योंकि यह एक प्रबंधित संवाद है) कहा जाता है के बीच onStart() और onResume()। यहाँ संकेत यह है कि संवाद पूर्ण स्क्रीन को कवर नहीं करता है और इसलिए दिखाई देने वाली मुख्य गतिविधि का हिस्सा छोड़ देता है। यह एक विस्तार है लेकिन इससे कोई फर्क नहीं पड़ता!


7

onStart()

  1. बाद OnCreate (बंडल) या onRestart के बाद () के बाद कहा जाता है onResume ()
  2. onStart()अपने UI को प्रभावित करने वाले परिवर्तनों पर नज़र रखने के लिए आप एक ब्रॉडकास्टर को पंजीकृत कर सकते हैं , आपको इसे onStop में अपंजीकृत करना होगा ()
  3. व्युत्पन्न वर्गों को सुपर क्लास के इस पद्धति के कार्यान्वयन के माध्यम से कॉल करना होगा। यदि वे नहीं करते हैं, तो एक अपवाद फेंक दिया जाएगा।

onResume()

  1. OnRestoreInstanceState (बंडल), onRestart (), या onPause () के बाद कॉल किया गया
  2. एनिमेशन शुरू करें, अनन्य-एक्सेस डिवाइस खोलें (जैसे कैमरा)

onStart() सामान्य रूप से एक बैकग्राउंड थ्रेड के लिए काम करते हैं, जिसके रिटर्न मान हैं:

  • अगर इसे सक्रिय रखने के लिए START_STICK को स्वचालित रूप से फिर से शुरू किया जाता है तो उसे मार दिया जाता है।

  • START_REDELIVER_INTENT यदि ऑटो स्टॉप से ​​पहले मारा गया था, तो ऑटो रीस्टार्ट और पुनः प्रयास करें।

onResume()डिवाइस द्वारा सोने के बाद या अलर्ट या अन्य आंशिक-स्क्रीन चाइल्ड गतिविधि के बाद ओएस द्वारा बुलाया जाता है, जो पिछली विंडो के एक हिस्से को दिखाई देता है, इसलिए फ़ील्ड को फिर से इनिशियलाइज़ करने की आवश्यकता होती है (अपवादों को पकड़ने के साथ एक कोशिश संरचना के भीतर) )। ऐसी स्थिति पैदा नहीं होती है onStop()जब बच्चा बंद हो जाता है।

onResume()onStart()जब गतिविधि पृष्ठभूमि से फिर से शुरू होती है, तब इसे कहा जाता है

अधिक जानकारी के लिए आप Android_activity_lifecycle_gotcha और गतिविधि जीवनचक्र पर जा सकते हैं


वास्तव में मैं जब मेरे एप्लिकेशन पृष्ठभूमि में चला जाता onstop हो जाता है
deadfish

5

उम्मीद है कि एक सरल विवरण: -

onStart () -> कहा जाता है जब गतिविधि दिखाई देती है, लेकिन अग्रभूमि में नहीं हो सकती है (उदाहरण के लिए एक AlertFragment शीर्ष पर या किसी अन्य संभावित उपयोग के मामले में)।

onResume () -> कहा जाता है जब गतिविधि अग्रभूमि में होती है, या उपयोगकर्ता गतिविधि के साथ बातचीत कर सकता है।


4

onStart()साधन Activityदिखाई राज्य में प्रवेश किया और लेआउट बनाई गई है लेकिन इस गतिविधि लेआउट के साथ बातचीत नहीं कर सकते हैं।

Resume() अब आप गतिविधि लेआउट के साथ बातचीत कर सकते हैं।


1

ध्यान दें कि ऐसी चीजें हैं जो कॉल के बीच onStart () और onResume () पर होती हैं। अर्थात्, OnNewIntent (), जो मैंने दर्द से पता लगाया है।

आप SINGLE_TOP ध्वज का उपयोग कर रहे हैं, और आप आशय एक्स्ट्रा कलाकार का उपयोग कर अपने गतिविधि के लिए कुछ डेटा भेजने के लिए, तो आप केवल onNewIntent () है, जो कहा जाता है में इसे उपयोग करने में सक्षम हो जाएगा के बाद onStart () और इससे पहले कि onResume ()। इसलिए आमतौर पर, आप एक्स्ट्रा से नया (शायद केवल संशोधित) डेटा ले लेंगे और इसे कुछ कक्षा के सदस्यों को सेट कर देंगे, या मूल गतिविधि के इरादे के रूप में नए इरादे को सेट करने और onResume () में डेटा को संसाधित करने के लिए setIntent () का उपयोग करेंगे।


0

Http://developer.android.com/training/basics/activity-lifecycle/starting.html का संदर्भ

onResume()गतिविधि को उपयोगकर्ता के साथ इंटरैक्ट करने से ठीक पहले कॉल किया जाता है। इस बिंदु पर गतिविधि गतिविधि स्टैक के शीर्ष पर होती है, जिसमें उपयोगकर्ता इनपुट उसके पास जाता है। हमेशा पीछा किया onPause()

onPause()जब सिस्टम किसी अन्य गतिविधि को फिर से शुरू करने के बारे में कहा जाता है। इस पद्धति का उपयोग आम तौर पर निरंतर डेटा के लिए सहेजे नहीं गए परिवर्तनों, एनिमेशन और अन्य चीजों को रोकने के लिए किया जाता है जो सीपीयू का उपभोग कर सकते हैं, और इसी तरह। इसे वह करना चाहिए जो यह बहुत जल्दी करता है, क्योंकि अगली गतिविधि फिर से शुरू नहीं होगी। onResume()यदि गतिविधि वापस सामने आती है, या onStop()यदि यह उपयोगकर्ता के लिए अदृश्य हो जाता है , तो या तो इसका अनुसरण किया जाता है।


0

निश्चित नहीं है कि यह उत्तर के रूप में गिना जाता है - लेकिन यहां Google वीडियो से Google का कोर्स (कोटलिन के साथ एंड्रॉइड ऐप विकसित करना) है जो अंतर बताता है।

  • प्रारंभ पर कहा जाता है जब गतिविधि दिखाई देती है
  • जब गतिविधि फ़ोकस खो जाती है (जैसे एक संवाद पॉप अप होता है) को रोक दिया जाता है
  • रिज्यूमे को तब कहा जाता है जब गतिविधि पर ध्यान केंद्रित हो जाता है (जैसे कि जब संवाद गायब हो जाता है)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.