Android में पुनः लोड गतिविधि


221

क्या एंड्रॉइडActivity में पुनः लोड करना एक अच्छा अभ्यास है ?

इसे करने का सबसे अच्छा तरीका क्या होगा? this.finishऔर फिर this.startActivityगतिविधि के साथ Intent?


3
मैं एक अनुभवी एंड्रॉइड डेवलपर नहीं हूं, लेकिन एक गतिविधि को पुनरारंभ करना खराब डिजाइन की तरह लगता है और इसे केवल चरम मामलों में किया जाना चाहिए।
हडसन

@ हडसन यह कॉन्फ़िगरेशन परिवर्तन पर क्या होता है। अगर यह अच्छा डिज़ाइन है या नहीं, यह पूरी तरह से एक और चर्चा है। ;)
hpique

1
@ हडसन तो आप अब 5 साल के अनुभव के डेवलपर हैं: डी
प्रतीक बुटानी

@PratikButani, क्या मैं आपको जानता हूं? :) मुझे अब 8 साल का अनुभव पसंद है, लेकिन एंड्रॉइड डेवलपमेंट के भीतर ज्यादा नहीं है।
हडसन

आपने मेरी प्रोफ़ाइल देखी जो मुझे पता है: पी @ हडसन
प्रतीक बुटानी

जवाबों:


521

आप बस उपयोग कर सकते हैं

finish();
startActivity(getIntent());

Activityखुद के भीतर से तरोताजा करने के लिए ।


2
क्या होगा अगर इसे गतिविधि वर्ग के अंदर नहीं बुलाया जा सकता है?, इसे संदर्भ संदर्भ के साथ करने का कोई तरीका है?
जियोर्जिलिन

1
@giorgiline - हाँ, एक इंटरफ़ेस बनाएँ जिसे आप गतिविधि वर्ग के अंदर परिभाषित करें, और उस इंटरफ़ेस को एक पैरामीटर के रूप में पास करें जो आप इसे उपयोग कर रहे हैं।
समुच्चय

1
वाह, मैंने नहीं सोचा था कि यह इतना आसान होगा।
दिबांग

1
परिणाम के लिए शुरू की गई गतिविधि से आप कैसे निपट सकते हैं? क्या आप पुनः आरंभ कर सकते हैं कि मूल कॉलर अभी भी परिणाम प्राप्त कर रहा है?
ताथू

1
@tothphu - हालांकि कोशिश नहीं की, लेकिन सैद्धांतिक रूप से मुझे लगता है हाँ। हालाँकि दूसरी बार गतिविधि समाप्त हो जाने के बाद, यह पहली बार बनाई गई गतिविधि का परिणाम नहीं लौटाएगा।
सुष

65

उन लोगों के लिए जो रीक्रिएट () विधि का उपयोग करने के बाद उस झपकी को देखना नहीं चाहते हैं

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

2
बहुत बढ़िया! मैं संक्रमण को ओवरराइड करना चाहता था ताकि उपयोगकर्ता ध्यान न दे!
सेड्डी मुहाज़ा

अच्छा काम! उपयोगकर्ता रीलोडिंग को बमुश्किल नोटिस करेगा।
सैम

38

वरीयता परिवर्तन से लौटने के बाद गतिविधि को फिर से लोड करने के लिए मैं यही करता हूं।

@Override
protected void onResume() {

   super.onResume();
   this.onCreate(null);
}

यह अनिवार्य रूप से गतिविधि को फिर से शुरू करने का कारण बनता है।

अपडेट किया गया: ऐसा करने का एक बेहतर तरीका recreate()विधि को कॉल करना है। यह गतिविधि को फिर से बनाने का कारण बनेगा।


15
यह काम कर सकता है लेकिन स्पष्ट रूप से जीवनचक्र विधियों को कॉल करने की दृढ़ता से अनुशंसा नहीं की जाती है।
इतिशा

यदि आप इस मार्ग को लेते हैं, तो आपको एक अलग init () पद्धति का उपयोग करना चाहिए जो सब कुछ सेट करता है और onCreate () और onResume () के भीतर से onCreate () को कॉल करने के बजाय कॉल करता है।
टॉम

1
जब आपके जीवनचक्र के तरीकों का उपयोग अन्य चीजों के लिए किया जाता है तो कुछ समाधानों को छोड़कर, महान समाधान नहीं होगा। उदाहरण के लिए, मैं फोन के कैमरे को एक्सेस कर रहा हूं, और जब फोटो लिया जाता है, तो स्क्रीन एक दृश्य में पोस्ट करने के लिए मेरी गतिविधि पर लौट आती है। ताज़ा करने के लिए जीवनचक्र के तरीकों का उपयोग करके, मैं कैमरे की प्रक्रिया से बाहर हो जाता हूं, और मेरी तस्वीर गतिविधि में वापस नहीं आती है, बल्कि मुझे शुरू से ही गतिविधि मिलती है। सिर्फ एक उदाहरण के बारे में पता होना चाहिए।
Azurespot

1
गतिविधि का लॉन्चमोड पर विचार करना महत्वपूर्ण है जब विश्राम () का उपयोग करें। उदाहरण के लिए, जब मैं लॉन्चमोड = सिंगलटॉप के साथ एक गतिविधि पर रीक्रिएट () कॉल करता हूं, तो मुझे ऑनक्रीट () को बाद में नहीं बुलाया जाता है। OTOH, यदि, कॉलिंग के बजाय विश्राम (), मैं स्पष्ट रूप से कॉल खत्म करता हूं () और startActivity () के बाद, मैं onCreate () को बाद में बुलाया जा रहा हूं।
अल्बर्ट सी ब्रौन

14

मैंने पहले उत्तर देखे जो कि आशय का उपयोग करके गतिविधि को फिर से लोड करने के लिए दिए गए हैं। वे काम करेंगे लेकिन आप एक्टिविटी क्लास में दी गई रीक्रिएट () पद्धति का उपयोग करके भी ऐसा कर सकते हैं।

इसके बजाय यह लिखना

// मुख्य गतिविधि को संवाद बॉक्स के करीब ताज़ा करें

Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish();

यह केवल यह लिखकर किया जा सकता है

recreate();

recreate()मेरे लिए समाधान था - "पुनरारंभ करना" गतिविधि मेरे लिए काम नहीं करती थी, क्योंकि मैंने "StartActivityForResult" का उपयोग करके गतिविधि शुरू की थी और इसने व्यवहार को तोड़ दिया।
KYL3R


10

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

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //

9

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

हालांकि यह सुनिश्चित करने के लिए अच्छा अभ्यास क्या है कि आपके ऑनपॉज और ऑनटॉप तरीके किसी भी संसाधन को जारी करते हैं, जिसे आपकी गतिविधियों को कम करने के लिए आपको ऑन-लाईन का उपयोग करने की आवश्यकता नहीं है।


2
OnLowMemory का उल्लेख करने के लिए +1। मुझे नहीं पता था कि इस तरह की विधि मौजूद थी!
hpique

4

अपने इरादे के साथ शुरू करें activityऔर बंद करें activity

Intent refresh = new Intent(this, Main.class);
startActivity(refresh);//Start the same Activity
finish(); //finish Activity.

4

कुछ मामलों में यह अन्य में सबसे अच्छा अभ्यास है यह एक अच्छा विचार नहीं है यह संदर्भ से प्रेरित है यदि आपने ऐसा करने के लिए चुना है तो अपने बेटों के लिए एक गतिविधि से गुजरने का सबसे अच्छा तरीका है:

    Intent i = new Intent(myCurrentActivityName.this,activityIWishToRun.class);    
    startActivityForResult(i, GlobalDataStore.STATIC_INTEGER_VALUE);

बात यह है कि जब भी आप गतिविधि से समाप्त होते हैं (तब से) आप अपनी जीवित गतिविधि में वापस आ जाएँ


1
यह शायद पुराना है लेकिन आपने मुझे बहुत समय बचाया है! :)
लोर इलुज़

4

अपनी संपूर्ण गतिविधि को पुनः लोड करना एक भारी काम हो सकता है। कोड का वह भाग डालें जिसे ( कोटलिन ) में ताज़ा किया जाना है :

override fun onResume() {
    super.onResume()
    //here...
}

जावा:

@Override
public void onResume(){
    super.onResume();
    //here...

}

और जब भी जरूरत हो " onResume () " पर कॉल करें ।


2

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


दरअसल, मैं एप्लिकेशन स्थिति को बदलना चाहता हूं और फिर परिवर्तन को प्रतिबिंबित करने के लिए गतिविधि को फिर से लोड करता हूं।
hpique

आपके मामले में "आवेदन स्थिति" क्या है? पसंद?
ज़ेहर

2

कुछ समय के लिए इसके साथ प्रयोग करने के बाद, मुझे किसी गतिविधि को फिर से शुरू करने का कोई अप्रत्याशित परिणाम नहीं मिला है। इसके अलावा, मेरा मानना ​​है कि ओरिएंटेशन में बदलाव होने पर एंड्रॉइड डिफ़ॉल्ट रूप से ऐसा ही करता है, इसलिए मुझे एक समान परिस्थिति में ऐसा नहीं करने का कोई कारण नहीं दिखता है।


इसके विपरीत, मैंने गतिविधि को पुनरारंभ करके अपनी स्क्रीन को "ताज़ा" करने की कोशिश की। Itdoesn't की सतह पर कुछ भी गलत नहीं हुआ, मेरी जानकारी मैं कैसे चाहता था अपडेट किया गया, LogCat एक अलग कहानी बताता है। LogCat में, मैं गतिविधि के onCreate विधि में वापस जाता हूं, यह वरीयताओं को खींचने का प्रयास करता है। पहला प्रयास मुझे एक शून्य सूचक अपवाद प्राप्त होता है, फिर यह ऑनक्रिएट में फिर से शुरू करने का प्रयास करता है और संग्रहित किए गए पी 2 पी के माध्यम से प्राप्त करता है। यह निश्चित नहीं है कि यहाँ क्या हो रहा है, लेकिन मैं सिर्फ यह सुनिश्चित करना चाहता था कि आप केवल परिणाम को नहीं देख रहे थे, क्योंकि WYSIWIG मेरे लिए ऐसा नहीं था।
तिरलोक

आप गतिविधि को फिर से कैसे शुरू कर रहे हैं?
20

2

मैं एक ही समस्या है

import android.support.v4.content.IntentCompat;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

यह कोड मेरे लिए काम करता है। एंड्रॉइड एपी 17


2

एक गतिविधि में आप गतिविधि recreate()को "पुनः बनाने" के लिए कॉल कर सकते हैं (एपीआई 11+)


1

मेरे पास एक और तरीका था: launchModeअपनी गतिविधि की सेटिंग singleTopऔर कॉलिंग के बिना finish(), बस startActivity(getIntent())काम करना होगा। बस दोनों में नए डेटा के बारे में परवाह करने के लिए है onCreate()और onNewIntent। सुष के तरीके के साथ, एप्लिकेशन को ब्लिंक किया जा सकता है जैसे AMAN SINGH ने कहा। लेकिन AMAN SINGH का दृष्टिकोण अभी भी एक नई गतिविधि का निर्माण करेगा, जो किसी भी तरह, अनावश्यक है, भले ही उसने 'पलक' समस्या को ठीक कर दिया हो, मुझे लगता है।

इस सवाल के लिए बहुत देर हो चुकी है, लेकिन अगर कोई समाधान की तलाश में है, तो यह यहां है।


0

लॉगइन करने के बाद मुझे भी यही समस्या थी इसलिए मैंने इसका इस्तेमाल किया

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}


0

मेरे लिए यह काम कर रहा है यह एक और इरादे नहीं बना रहा है और उसी पर नया डेटा लोड किया गया है।

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.