Android Activites के onPause () और onStop () में क्या अंतर है?


149

Android doc से यहाँ http://developer.android.com/reference/android/app/Activity.html पर , यह कहा कि 'गतिविधि अग्रभूमि में आती है' कॉल करेगी onPause(), और 'गतिविधि अब दिखाई नहीं देती है' कॉल करेगी onStop()

क्या 'गतिविधि अग्रभूमि में नहीं आती' उसी तरह है जैसे 'गतिविधि अब दिखाई नहीं देती'? क्या आप मुझे बता सकते हैं कि उनके बीच क्या अंतर है?


17
एक उत्कृष्ट प्रश्न के लिए +1। इसके अलावा, एक pausedगतिविधि पूरी तरह से जीवित है (यह सभी राज्य और सदस्य जानकारी रखता है और विंडो प्रबंधक से जुड़ा रहता है)। एक stoppedगतिविधि भी सभी राज्य और सदस्य जानकारी को बरकरार रखती है, लेकिन अब इससे जुड़ी नहीं है window manager
ateiob

जवाबों:


107

नहीं, अगर कुछ गतिविधि अग्रभूमि में आती है, तो इसका मतलब यह नहीं है कि दूसरी गतिविधि पूरी तरह से अदृश्य है। निम्नलिखित मामले पर विचार करें:

विषय Theme.Dialog के साथ गतिविधि

यहां हम एक ही समय में दोनों गतिविधियों को देखते हैं। खेतों के साथ पहली गतिविधि दूसरी गतिविधि द्वारा अस्पष्ट है, और उपयोगकर्ता अब इसके साथ बातचीत नहीं कर सकता है। हालाँकि, यह अभी भी सभी परिणामी परिणामों के साथ दिखाई दे रहा है।

यह एक सवाल छोड़ देता है कि कौन सी गतिविधि पूरी तरह से अपारदर्शी मानी जाती है और पूरी स्क्रीन को कवर करती है और जो नहीं है। यह निर्णय गतिविधि युक्त खिड़की पर आधारित है। यदि खिड़की में एक झंडा है windowIsFloatingया windowIsTranslucent, तो यह माना जाता है कि गतिविधि अंतर्निहित सामान को अदृश्य नहीं बनाती है, अन्यथा यह करता है और onStop()कहा जाता है। प्रासंगिक कोड में पाया जा सकता है com.android.server.am.ActivityRecord:

fullscreen = ent != null && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsFloating, false)
        && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsTranslucent, false);

10
एक महान विवरण के लिए, आंशिक बनाम कुल (इन) दृश्यता पर ध्यान केंद्रित करते हुए। स्क्रीन के थ्रेशोल्ड प्रतिशत को जानना दिलचस्प होगा जो एंड्रॉइड के बीच का निर्णय लेता है onPause()और onStop()। क्या यह 100% है? यदि पिछली गतिविधि से केवल एक पिक्सेल दिखाई देता है, तो क्या यह अभी भी है onPause()?
एटियोब

3
@ateiob यह कहीं भी नहीं कहा गया है, लेकिन मुझे ऐसा लगता है। हालाँकि, यह आमतौर पर स्पष्ट होता है क्योंकि अधिकांश गतिविधियाँ जो पूरी स्क्रीन को नहीं भरती हैं बस एक सिस्टम को संवाद के लिए उपलब्ध कराई गई शैलियों का उपयोग करती हैं।
माल्कम

1
अजीब बात है, लेकिन onPause()जब एक संवाद प्रदर्शित होता है , तो मेरे आवेदन में बिल्कुल भी नहीं बुलाया जाता है। onPause()केवल तभी कहा जाता है जब मैं होम बटन दबाता हूं । यह कैसे हो सकता है?
एटियोब

यह सही उत्तर होना चाहिए। वैसे, अग्रभूमि बात एक संवाद या गतिविधि है?
GMsoF

3
@GMsoF एक गतिविधि। यह मुख्य बिंदु है: प्रत्येक संवाद वास्तव में एक संवाद नहीं है। आप एक गतिविधि को एक संवाद की तरह बना सकते हैं, इसलिए यह वास्तव में पूरी स्क्रीन से छोटा है।
मैलकम

38

यदि आप अभी भी इसके किसी भी हिस्से को देख सकते हैं ( Activityअग्रभूमि में आना या तो पूरी स्क्रीन पर कब्जा नहीं करता है, या यह कुछ पारदर्शी है), onPause()कहा जाएगा। यदि आप इसका कोई हिस्सा नहीं देख सकते हैं, onStop()तो इसे बुलाया जाएगा।

एक संवाद **, उदाहरण के लिए, पूरे पिछले को कवर नहीं कर सकता है Activity, और इसे onPause()कॉल करने का समय होगा ।

** मैं यहां एक एंड्रॉइड डायलॉग का जिक्र नहीं कर रहा हूं, बल्कि एक ऐसी चीज का वैचारिक विचार है जो पॉप अप करता है और केवल उपयोगकर्ता स्क्रीन का हिस्सा अस्पष्ट करता है। इस नोट को नीचे @GsoFF की एक टिप्पणी के आधार पर स्पष्ट करने के लिए जोड़ा गया था


33
नहीं। यह भ्रामक है। दिखाया गया एक संवाद onPause () को कॉल नहीं करेगा क्योंकि संवाद वर्तमान गतिविधि के संदर्भ का उपयोग करता है, गतिविधि को जीवंत मानता है।
GMsoF

6
@GMsoF ऐसा लगता है जब मैंने डायलॉग कहा था, आपको लगा कि मेरा मतलब है Dialog, जैसे कि एंड्रॉइड क्लास में है। हालांकि, मुझे जो मिल रहा था, वह कुछ ऐसा है जो Activityइस विचार को स्पष्ट करने के लिए सबसे पहले अस्पष्ट है कि सभी नए Activityको पहले से पूरी तरह से कवर करने की आवश्यकता नहीं है।
nicholas.hauschild

11

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


5
संवाद की बात भ्रामक हो सकती है। आइए इस गतिविधि के मुख्य UI थ्रेड से एक चेतावनी संवाद पॉप अप किया जाता है, ऑनपॉज़ () को इस मामले में नहीं बुलाया जाएगा। केवल तभी यह संवाद अन्य गतिविधि या अन्य ऐप से पॉप अप होता है।
सैम 003 जुलाह

1
@ ज़िशेंग - मैं आपकी टिप्पणी से सहमत हूँ। मैं सिर्फ एक्टिविट्स गाइड विषय पर चर्चा कर रहा था : " onPause()यह उस समय कहा जाता है जब डिवाइस सो जाता है या जब कोई संवाद दिखाई देता है" । के रूप में इस सूत्र स्पष्ट करता है, हालांकि, एक संवाद नहीं है जरूरी मतलब है कि एक गतिविधि रोक दिया गया है (हालांकि यह के लिए, कहते हैं, एक होगा गतिविधि एक संवाद के रूप में दिखाया )।
टेड हॉप

9

व्यावहारिक रूप से , किसी को "onPause ()" और "onPause () + onStop ()" के बीच के अंतर पर विचार करना चाहिए

जब भी कुछ नई गतिविधि होती है और स्क्रीन के कुछ आंशिक स्थान पर कब्जा कर लेती है। इसलिए आपकी पहले से चल रही गतिविधि अभी भी कुछ हद तक दिखाई दे रही है। इस स्थिति में, पहले से चल रही गतिविधि को बैक स्टैक पर नहीं धकेला जाता है। तो, यहाँ केवल ऑनपॉज़ () विधि को कहा जाता है

दूसरी ओर, अगर कुछ नई गतिविधि होती है और पूरी स्क्रीन पर कब्जा कर लेती है ताकि आपकी पहले से चल रही गतिविधि गायब हो जाए। इस स्थिति में, आपकी पहले से चल रही गतिविधि को बैक स्टैक में ले जाया जाता है। यहाँ, onPause () + onStop () कहलाते हैं।

सारांश के लिए-

ऑनपॉज़ () - स्क्रीन आंशिक रूप से अन्य नई गतिविधि द्वारा कवर की जाती है। गतिविधि को बैक स्टैक में नहीं ले जाया जाता है।

onPause () + onStop () - स्क्रीन पूरी तरह से अन्य नई गतिविधि से आच्छादित है। गतिविधि को बैक स्टैक में ले जाया जाता है।

आगे जानिए- बैक स्‍टैक


0

संक्षिप्त शब्दों में:

onStop()अन्य गतिविधि दिखाए जाने पर पिछली गतिविधि का जीवन-चक्र विधि लागू किया जाता है। जब आपके पास गतिविधि के शीर्ष पर डायलॉग होता onPause()है , तो इसे लागू किया जाता है।

नोट : गतिविधियाँ वे घटक हैं जो आपकी पूरी स्क्रीन को भरते हैं।

नोट : संवाद गतिविधि नहीं है क्योंकि वे स्क्रीन को पूरी तरह से नहीं भरते हैं।


0

मुझे ऑनपॉज और ऑनटॉप विधियों के साथ कई समस्याओं का सामना करना पड़ा और इसलिए मैं तीन परिदृश्यों को स्पष्ट करूंगा, जो कि मुझे आए थे-
1. जब आप हाल के ऐप बटन पर क्लिक करते हैं, तो कोई भी जीवन चक्र विधि नहीं कहलाती है, लेकिन onWindowFocusChanged (बूलियन .Focus) hasFocus मान के साथ कहा जाता है असत्य के रूप में पारित किया। 5 से पहले के एंड्रॉइड वर्जन में, हाल ही में ऐप बटन दबाने पर ऑनपॉज विधि का उपयोग किया जाता है।

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

3।यदि आपकी गतिविधि पर स्क्रीन समय समाप्त हो जाता है, तो ऑनपॉज़ को कहा जाता है। कुछ समय बाद अगर आप स्क्रीन नहीं खोलेंगे तो ऑनस्पॉट कहा जाएगा।

उत्तर को पूरा करने वाले एटिएब द्वारा उल्लेखित एक महत्वपूर्ण बात भी

एक रुकी हुई गतिविधि पूरी तरह से जीवित है (यह सभी राज्य और सदस्य जानकारी रखता है और विंडो प्रबंधक से जुड़ी रहती है)। एक रुकी हुई गतिविधि भी सभी राज्य और सदस्य जानकारी को बरकरार रखती है, लेकिन अब विंडो प्रबंधक से जुड़ी नहीं है


आशा करता हूँ की ये काम करेगा।


0

जब भी कोई नई गतिविधि शुरू होती है, तो पिछली गतिविधि onPauseको किसी भी परिस्थिति में सुरक्षित रूप से बुलाया जाएगा।

वास्तव में दो परिस्थितियाँ होंगी:

1- पिछली गतिविधि का एक हिस्सा दिखाई देता है या नई गतिविधि पारदर्शी है: केवल onPause कहा जाएगा।

2- पिछले गतिविधि पूरी तरह से नया गतिविधि के द्वारा कवर किया जाता है: दोनों onPauseऔर onStopकहा जाएगा

---- कुछ नोट बताने में अच्छा:

नोट 1: एक संवाद की एक गतिविधि कोई नहीं के शीर्ष पर शुरू होता है, तो onPauseया onStopबुलाया जाएगा।

नोट 2: यदि इसकी एक गतिविधि जिसका विषय एक संवाद के लिए सेट है, तो व्यवहार एक सामान्य गतिविधि की तरह होगा।

नोट 3: जाहिरा तौर पर अनुमति संवाद जैसे सिस्टम संवाद चूंकि मार्शमैलो का कारण होगा onPause


-5

हां, मैं समझने की कोशिश करता हूं और मैं इसे नीचे बता सकता हूं:

2 गतिविधियां हैं: एक्टिवा और एक्टिविटीबी

public class ActivityA extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
}

private void initialize() {
    Log.i("Activity A", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity A", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i("Activity A", "onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity A", "onResume");
}

@Override
protected void onPause() {
    super.onPause();
    Log.i("Activity A", "onPause");
}

@Override
protected void onStop() {
    super.onStop();
    Log.i("Activity A", "onStop");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.i("Activity A", "onDestroy");
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        Intent activityB = new Intent(this, ActivityB.class);
        startActivity(activityB);
        break;
    default:
        break;
    }
}

यहाँ गतिविधि बी है। कोड में मेरी टिप्पणी का पालन करें

public class ActivityB extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
    // if call finish() here, activityA will don't stop, just pause
    // Activity A will call onStop() when Activity B call onStart() method
    finish();
}

private void initialize() {
    Log.i("Activity B", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity B", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i("Activity B", "onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity B", "onResume");
}


@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        finish();
        break;
    default:
        break;
    }
}
}

मुझे उम्मीद है कि यह स्पष्ट रूप से है


हमेशा, यह समझाने की कोशिश करें कि समझ में आता है
अलेक्जेंडर Zaldostanov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.