2015-06-30 2 views
6

मैं ऑन पॉज़ और ऑनस्टॉप के बीच के अंतर को समझने की कोशिश कर रहा हूं।एंड्रॉइड: परिदृश्य जहां पर रोक दिया जाता है लेकिन स्टॉप पर नहीं?

मैंने सभी अलग-अलग मंच पढ़े हैं लेकिन मैं अभी भी अंतर के बारे में स्पष्ट नहीं हूं। मैंने कोशिश की है कि किस विधि को बुलाया जाता है, कोशिश करने और परीक्षण करने के लिए मैंने एक सरल ऐप बनाया है। इसके लिए मैंने बस प्रत्येक विधि में लॉगर्स रखे हैं।

मेरी परीक्षणों से -

  1. पॉपअप कॉल नहीं करते किसी भी विधि
  2. किसी अन्य गतिविधि में स्विच करना दोनों तरीकों
  3. नोटिफिकेशन बार को नीचे खींच कॉल न विधि

मैंने कॉल केवल दोनों तरीकों को त्वरित उत्तराधिकार में बुलाया जा रहा है या न ही सभी को बुलाया जा रहा है। मैं परिदृश्य ढूंढने की कोशिश कर रहा हूं जहां पर कॉल किया जाता है लेकिन ऑनस्टॉप नहीं करता है।

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

public class LifecycleActivity extends ActionBarActivity { 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.d("Rachit", "In Destroy Method"); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_lifecycle); 
     Log.d("Rachit", "In Create Method"); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.d("Rachit", "In Start Method"); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Log.d("Rachit", "In Resume Method"); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     Log.d("Rachit", "In Pause Method"); 
    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     Log.d("Rachit", "In Restart Method"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.d("Rachit", "In Stop Method"); 
    } 
} 

उत्तर

4

मैंने थोड़ी देर बाद यह पता लगाया, लेकिन मेरा जवाब यहां पोस्ट करना भूल गया।

उदाहरण जहां मैंने देखा कि ऑनपॉज़() को तत्काल बाद के कॉल ऑन स्टॉप() के बिना कॉल किया गया था, जब मुझे अपने फोन पर एक अलग ऐप खोलने पर एक अलग एप्लिकेशन से अधिसूचना मिली।

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

1

आधिकारिक Android डेवलपर्स पेज आप सभी जानकारी गतिविधि के इन दो राज्यों से संबंधित

onPause() देख सकते हैं (http://developer.android.com/training/basics/activity-lifecycle/pausing.html)

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

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

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

आपको अगर अपनी गतिविधि वास्तव में बंद कर दिया जा रहा है उपयोगकर्ता के अगले गंतव्य के लिए एक तेजी से संक्रमण के लिए अनुमति देने के लिए onPause() विधि अपेक्षाकृत सरल में किया आपरेशनों की राशि रखना चाहिए।

नोट: जब आपकी गतिविधि रोका जाता है, तो गतिविधि उदाहरण स्मृति में निवासी रखा जाता है और गतिविधि को फिर से शुरू होने पर याद किया जाता है। आप को किसी भी समय के लिए शुरू किए गए कॉलबैक विधियों के दौरान बनाए गए घटकों को फिर से शुरू करने की आवश्यकता नहीं है।

onStop() (http://developer.android.com/training/basics/activity-lifecycle/stopping.html)

जब अपनी गतिविधि विधि onStop() के लिए एक कॉल प्राप्त करता है, यह कोई अब दिखाई दे रहा है और लगभग सभी संसाधन है कि की जरूरत नहीं कर रहे हैं जारी करना चाहिए जबकि उपयोगकर्ता इसका उपयोग नहीं कर रहा है। एक बार आपकी गतिविधि बंद हो जाने पर, सिस्टम सिस्टम को मेमोरी पुनर्प्राप्त करने की आवश्यकता होने पर इंस्टेंस को नष्ट कर सकता है। चरम मामलों में, सिस्टम गतिविधि के अंतिम ऑनड्रॉय() कॉलबैक को कॉल किए बिना आपके ऐप प्रक्रिया को आसानी से मार सकता है, इसलिए यह महत्वपूर्ण है कि आप संसाधनों को रिलीज़ करने के लिए Stop() पर उपयोग करें जो स्मृति को रिसाव कर सकता है।

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

जब आपकी गतिविधि बंद हो जाती है, तो गतिविधि ऑब्जेक्ट को मेमोरी में निवासी रखा जाता है और गतिविधि को फिर से शुरू होने पर याद किया जाता है। आपको को फिर से प्रारंभ करने वाले घटकों की आवश्यकता नहीं है जो कि किसी भी कॉलबैक के दौरान बनाए गए विधियों को फिर से शुरू करने वाले विधियों के दौरान बनाए गए थे। यह प्रणाली लेआउट में प्रत्येक दृश्य के लिए वर्तमान स्थिति के को ट्रैक भी रखती है, इसलिए यदि उपयोगकर्ता ने एक संपादन टेक्स्ट विजेट में टेक्स्ट दर्ज किया है, तो उस सामग्री को बनाए रखा जाता है ताकि आप को सहेजने और उसे पुनर्स्थापित करने की आवश्यकता न हो।

नोट: भले ही प्रणाली अपनी गतिविधि को नष्ट कर देता है, जबकि इसे बंद कर दिया है, यह अभी भी देखें वस्तुओं (जैसे कि एक EditText में पाठ के रूप में) एक बंडल (कुंजी-मान जोड़ों का एक ब्लॉब) में और पुनर्स्थापित की स्थिति को बरकरार रखे हुए यदि उपयोगकर्ता गतिविधि के उसी उदाहरण पर वापस जाता है ( पाठ में अन्य राज्य डेटा को सहेजने के लिए बंडल का उपयोग करने के बारे में अधिक बात करता है, तो आपकी गतिविधि नष्ट हो जाती है और फिर से बनाई जाती है)।

+0

हाँ, पर मैं अभी तक एक उदाहरण जहां onPause कहा जाता हो जाता है लेकिन onStop नहीं है खोजने के लिए है। अगर उन्हें हमेशा एक साथ बुलाया जाता है, तो क्या यह सिर्फ एक विधि रखने और डेटा बचाने या उसमें संसाधनों को रिलीज करने के लिए अधिक समझ में नहीं आता है? – Rachit

+0

ऑनस्टॉप विधि केवल तब कॉल की जाती है जब गतिविधि पूरी तरह से दिखाई नहीं दे रही है, जबकि जब भी गतिविधि अभी भी दिखाई दे रही है लेकिन पृष्ठभूमि में बना हुआ है तो ऑनपॉज़ विधि को कॉल किया जाता है। उदाहरण के लिए, जब आप एक संवाद दिखाते हैं। गतिविधि संवाद के पीछे चल रहा है, लेकिन यदि आप एक नई गतिविधि खोलते हैं, तो रोकें और ऑनटॉप @Rachit –

+0

की विधि से गुजरती है यह समस्या है। एक संवाद पर कॉल नहीं करता है। मैंने संवाद बॉक्स प्राप्त करने का प्रयास किया है, लेकिन फिर भी ऑनऑज़ को कॉल नहीं किया जाता है। – Rachit

4

यह परिदृश्य तब होता है जब आप अपने वर्तमान गतिविधि, तो वर्तमान गतिविधि का onPause() कहा जाता है से एक DialogActivity शुरू करने और मौजूदा ActivityonResume() पर आने के बाद कहा जाता है।

अधिक जानकारी के लिए, कृपया Developer Docs देखें।

+0

एफडब्ल्यूआईडब्ल्यू [यह उत्तर] (http://stackoverflow.com/a/7384782/1276636) एंड्रॉइड फ्रेमवर्क इंजीनियर द्वारा एक महान पढ़ा गया है। ईश्वर वर्मा के जवाब में 'संवाद सक्रियता' एक ऐसी गतिविधि है जो एक संवाद की शैली को लागू करती है, इसलिए मूल रूप से यह एक गतिविधि है जो एक संवाद की तरह दिखती है। – Sufian

0

जब हम उस समय वर्तमान गतिविधि से संवाद गतिविधि शुरू करते हैं तो उस समय केवल onPause() कहा जाएगा। पूर्व: मान लें कि हमारे पास ए और बी गतिविधि है। अब गतिविधि बी संवाद गतिविधि है और गतिविधि ए सामान्य गतिविधि है। जब हम गतिविधि एक से गतिविधि बी शुरू करते हैं, तो गतिविधि एक के onPause() बुलाया जाएगा और गतिविधि बी के onCreate(), onStart() और onResume() नमूना कोड sample code

3

गतिविधि एक के लिए नीचे दिए url जाँच called.Please हो जाएगा -> गतिविधि बी हैं बी पारदर्शी है, ए 'ऑन पॉज़ को बुलाया जाएगा लेकिन कोई स्टॉप नहीं होगा।

0

ऐसा करने का एक और तरीका है। एक परिदृश्य लेते हैं जहां आप गतिविधि लॉन्च मोड सिंगलेटस्क है और इससे एक अधिसूचना बनाते हैं और इसे ट्रिगर करते हैं और उसी लंबित इरादे को फिर से कॉल करते हैं तो ऑन्रेस को रोक पर पोस्ट कहा जाएगा।

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     sendNotification(); 
    } 

    private final static String TAG = "TestOne"; 

    public void sendNotification(){ 
     NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(this); 

    //Create the intent that’ll fire when the user taps the notification// 

    Intent i = new Intent(MainActivity.this, MainActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0); 


    mBuilder.setContentIntent(pendingIntent); 

    mBuilder.setSmallIcon(R.mipmap.ic_launcher); 
    mBuilder.setContentTitle("My notification"); 
    mBuilder.setContentText("Hello World!"); 

    NotificationManager mNotificationManager = 

      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

    mNotificationManager.notify(001, mBuilder.build()); 

} 

मैनिफ़ेस्ट:

<activity android:name=".MainActivity" 
     android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".Main2Activity"></activity> 
संबंधित मुद्दे