onNewIntent () जीवनचक्र और पंजीकृत श्रोता


150

मैं एक एकल-संवाद गतिविधि का उपयोग कर रहा हूँ ताकि खोज-संवाद के माध्यम से इंटेंट प्राप्त किया जा सके onNewIntent()

मैंने जो देखा वह onPause()पहले कहा जाता है onNewIntent(), और फिर बाद में कॉल करता है onResume()। दिखने में:

  • खोज संवाद आरंभ किया गया
  • खोज इरादा गतिविधि के लिए निकाल दिया गया
  • onPause()
  • onNewIntent()
  • onResume()

समस्या यह है कि मेरे पास पंजीकृत श्रोता हैं, onResume()जिन्हें हटा दिया जाता है onPause(), लेकिन onNewIntent()कॉल के अंदर उनकी आवश्यकता होती है । क्या उन श्रोताओं को उपलब्ध कराने का कोई मानक तरीका है?

जवाबों:


294

onNewIntent()इसका मतलब सिंगलटॉप गतिविधियों के लिए प्रवेश बिंदु है जो पहले से ही स्टैक में कहीं और चलते हैं और इसलिए कॉल नहीं कर सकते हैं onCreate()। गतिविधियों के जीवनचक्र के दृष्टिकोण से इसलिए इसे onPause()पहले कॉल करने की आवश्यकता है onNewIntent()। मेरा सुझाव है कि आप इन श्रोताओं के अंदर का उपयोग नहीं करने के लिए अपनी गतिविधि को फिर से लिखना चाहते हैं onNewIntent()। उदाहरण के लिए ज्यादातर समय मेरे onNewIntent()तरीके बस इस तरह दिखते हैं:

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // getIntent() should always return the most recent
    setIntent(intent);
}

सभी सेटअप लॉजिक onResume()का उपयोग करके हो रहा है getIntent()


@Rodja आप इस पर टिप्पणी के लिए कृपया जाएगा stackoverflow.com/questions/19092631/... भी
डेवलपर

3
मूल प्रश्न से संबंधित: ध्यान रखें कि यदि आप खोज को संभालने के लिए कोड को स्थानांतरित Intentकरते हैं onResume(), तो आपकी गतिविधि संभवतया हर बार खोज शुरू करने की कोशिश करेगी, जैसा कि आप चाहते हैं वह व्यवहार नहीं है।
टोनी चैन

1
रोडजा कहते हैं: गतिविधियों के जीवन चक्र के दृष्टिकोण से इसलिए इसे ऑनपॉइंट () से पहले ऑन करने की आवश्यकता होती है (चालू) एंड्रॉइड ने इसे इस तरह से डिजाइन करने की आवश्यकता नहीं की थी। आपकी गतिविधि पहले से ही फिर से शुरू () के माध्यम से अपने जीवनचक्र के माध्यम से चली गई है। Android के लिए कोई जरूरत नहीं onPause () पर कॉल करने के लिए फिर onResume () पर कॉल करें। यदि एप्लिकेशन को फिर से शुरू किया जाता है तो ओएस बस ऑन-एंटेंट () को कॉल कर सकता है और फिर से शुरू होने की स्थिति में रह सकता है।
सानी एल्फिश्वि

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

ध्यान देने वाली महत्वपूर्ण बात यह है कि getIntent () अभी भी मूल इरादे को लौटाता है। आप नए इरादे को अद्यतन करने के लिए setIntent (आशय) का उपयोग कर सकते हैं।
linuxjava

15

नोट: एक जीवनचक्र विधि को दूसरे से कॉल करना एक अच्छा अभ्यास नहीं है। नीचे दिए गए उदाहरण में मैंने यह हासिल करने की कोशिश की है कि आपके onNewIntent को हमेशा आपके गतिविधि प्रकार के बावजूद कहा जाएगा।

OnNewIntent () हमेशा गतिविधि शुरू होने पर पहली बार को छोड़कर सिंगलटॉप / टास्क गतिविधियों के लिए बुलाया जाता है। उस समय onCreate को इस थ्रेड पर पूछे गए कुछ प्रश्नों के समाधान के लिए प्रदान किया जाता है।

आप onNewIntent को हमेशा onCreate मेथड में लगाकर इनवॉइस कर सकते हैं

@Override
public void onCreate(Bundle savedState){
    super.onCreate(savedState);
    onNewIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}

59
आम तौर पर जीवन चक्र विधियों को सीधे कॉल करने के लिए एक अच्छा विचार नहीं है, नहीं? हो सकता है कि हानिरहित, या हो सकता है कुछ आधार कार्यान्वयन onNewIntent () मानता है कि onPause () को पहले ही बुलाया गया है? संभवतः दोनों स्थानों से कॉल करने योग्य विधि में ऐप कोड को सुरक्षित करना।
बर्नकल

12
माना। हम इस दृष्टिकोण का उपयोग करके कुछ किनारे के मामलों में भाग गए। सबसे अच्छा परहेज।
साद फारूक

3
हाँ .. मैं भी इसे टालने पर सहमत हूँ ... यह उन लोगों के लिए था जो ऑनक्रिएट के साथ-साथ onNewIntent का आह्वान करना चाहते हैं।
पवन माहेश्वरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.