Android में गतिविधि कैसे पुनः आरंभ करें


381

मैं Android को कैसे पुनः आरंभ कर सकता हूं Activity? मैंने निम्नलिखित की कोशिश की, लेकिन Activityबस चुटकी ली।

public static void restartActivity(Activity act){

        Intent intent=new Intent();
        intent.setClass(act, act.getClass());
        act.startActivity(intent);
        act.finish();

}

9
गतिविधि समाप्त हो जाती है क्योंकि यू को "एक्ट.फिनिश ();" गतिविधि बनाने के तुरंत बाद ...
निखिल दिनेश

1
पुरानी विधि
१५

जवाबों:


623

मैंने अपना थीम स्विचर इस तरह किया:

Intent intent = getIntent();
finish();
startActivity(intent);

असल में, मैं finish()पहले फोन कर रहा हूं, और मैं उसी इरादे का उपयोग कर रहा हूं जो इस गतिविधि के साथ शुरू किया गया था। ऐसा लगता है कि चाल है?

अद्यतन: जैसा कि नीचे राल्फ द्वारा बताया गया है, Activity.recreate()एपीआई 11 और उससे आगे जाने का तरीका है। यदि आप API11 + परिवेश में हैं तो यह बेहतर है। आप अभी भी वर्तमान संस्करण की जांच कर सकते हैं और ऊपर कोड स्निपेट को कॉल कर सकते हैं यदि आप एपीआई 10 या उससे नीचे हैं। (कृपया राल्फ के उत्तर को मत भूलना!)


36
और यह मूल्यहीन है? यह ओपी द्वारा उल्लिखित आवश्यकता नहीं थी। वास्तव में, यह वांछित हो सकता है।
EboMike

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

28
मुझे लगता है कि आपको वह गलत लगा। एक नीच का अर्थ है गलत / बुरा उत्तर, और उत्थान का अर्थ है एक उत्तर महान। दूसरों की तुलना में कितना बढ़िया उत्तर दिया जाता है, यह अपवोट की संख्या से संकेत मिलता है। मैं देख सकता हूं कि आप अपने उत्तर को बढ़ावा देने की कोशिश कर रहे हैं, लेकिन आप उस उद्देश्य के लिए सिस्टम का दुरुपयोग कर रहे हैं।
EboMike

8
+1 - यह मेरे लिए बहुत अच्छा काम करता है, और जैसा कि आप कहते हैं, एनीमेशन कुछ ऐसा है जो मैं चाहता था, इसलिए उपयोगकर्ता जानता है कि यह पुनरारंभ हो रहा है। एफडब्ल्यूआईडब्ल्यू, मैं इसे एक नियम बनाता हूं कि मैं कभी भी अन्य उपयोगकर्ताओं के जवाबों को मत न दें जब मैं प्रश्न का एक वैकल्पिक उत्तर प्रदान करता हूं, हालांकि मैं कभी-कभी मतदान करता हूं जब मेरा उत्तर स्पष्ट हो जाता है (यह कहते हुए कि यहां नहीं हुआ, बस मैं ऐसा करता हूं) ।
माइकल ब्रे

4
EboMike और बेन: आपके दोनों समाधानों ने ओपी के प्रश्न का उत्तर दिया। शुद्ध रूप से "सौंदर्यवादी" कारण से किसी के उत्तर को वोट करने के लिए, ठीक है, महान नहीं। मैं किसी को भी इसे
स्टैकओवरफ़्लो

368

चूंकि एपीआई स्तर 11 (हनीकॉम्ब), आप गतिविधि के विश्राम () विधि ( इस उत्तर के लिए धन्यवाद ) को कॉल कर सकते हैं ।

बहिरंग () विधि विन्यास परिवर्तन की तरह ही कार्य करती है, इसलिए आपके onSaveInstanceState () और onRestoreInstanceState () विधियों को भी कहा जाता है, यदि लागू हो।


3
क्या होगा यदि पिछली गतिविधि ने इसे स्टार्ट एक्टीविटीफॉरसेल्ट का उपयोग करके बुलाया है?
Android डेवलपर

1
ठीक है, यह सही उत्तर है यदि आपको एपीआई 11 की तुलना में कुछ भी कम समर्थन करने की आवश्यकता नहीं है
एडवर्ड फॉक

@EdwardFalk कोई भी फ़ंक्शन है जो इसे समर्थन लाइब्रेरी पर करता है?
Android डेवलपर

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

मैं वह हूं जो नहीं चाहता कि राज्य को बचाया जाए। कभी-कभी लोग बस एक साफ पुनरारंभ चाहते हैं, तो उन्हें एबोमाइक के उत्तर का उपयोग करना चाहिए।
किमी चिउ

132

एसडीके 11 से पहले, ऐसा करने का एक तरीका ऐसा है:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}

एचटीसी डिजायर एनिमेशन अभी भी (कम से कम जब onConfigurationChanged विधि में उपयोग किया जाता है) रहते हैं। वे हमेशा नहीं होते हैं, लेकिन EboMike के कोड का उपयोग करके वे भी हमेशा नहीं होते हैं।
Juozas Kontvainis

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

अच्छी बात। समझ में आता है क्योंकि यह स्टैक में आधार गतिविधि से खत्म () कहता है।
बेन

जब हम गतिविधि के विषय को बदलते हैं तो इसे कॉल करना गति (एनिमेशन के बिना) को बाहर लाता है
अशोक गोली

3
+1 मुख्य कार्य के साथ मेरे लिए भी ठीक है। हालांकि, अगर आप कॉल करना चाहिए overridePendingTransition(0, 0);के बाद finish()और startActivity()क्रमशः जहां आप इसे कहा जाता है,, नहीं ...
कांव-कांव

115

बस राल्फ और बेन के उत्तरों (टिप्पणियों में किए गए बदलाव सहित) को संयोजित करने के लिए:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();
} else {
    Intent intent = getIntent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);

    startActivity(intent);
    overridePendingTransition(0, 0);
}

8
सभी का सबसे अच्छा जवाब। मानो या ना मानो, मैं अभी भी एपीआई 3 उपकरणों का समर्थन कर रहा हूं, और VERSION.SDK_INT मान के लिए API 4 की आवश्यकता है। :)
एडवर्ड फाल्क

31

मैंने इस कोड का उपयोग किया है इसलिए मैं अभी भी पुराने एंड्रॉइड संस्करणों का समर्थन कर सकता हूं और recreate()नए एंड्रॉइड संस्करणों पर उपयोग कर सकता हूं ।

कोड:

public static void restartActivity(Activity activity){
    if (Build.VERSION.SDK_INT >= 11) {
        activity.recreate();
    } else {
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
}

नमूना:

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Activity mActivity;

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

        mActivity = MainActivity.this;

        Button button = (Button) findViewById(R.id.restart_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                restartActivity(mActivity);
            }
        });
    }

    public static void restartActivity(Activity activity) {
        if (Build.VERSION.SDK_INT >= 11) {
            activity.recreate();
        } else {
            activity.finish();
            activity.startActivity(activity.getIntent());
        }
    }
}

मेरे लिए बहुत अच्छा काम है !!
पापो

22

इस समाधान ने मेरे लिए काम किया।

पहले गतिविधि को समाप्त करें और फिर इसे फिर से शुरू करें।

नमूना कोड:

public void restartActivity(){
    Intent mIntent = getIntent();
    finish();
    startActivity(mIntent);
}

20

यह वर्तमान गतिविधि को पुनः आरंभ करने का सबसे आसान तरीका है:

finish();
startActivity(getIntent());

19

इस विधि को बुलाओ

private void restartFirstActivity()
 {
 Intent i = getApplicationContext().getPackageManager()
 .getLaunchIntentForPackage(getApplicationContext().getPackageName() );

 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
 startActivity(i);
 }

धन्यवाद,


1
मुझे लगता है कि ओपी किसी भी गतिविधि को फिर से शुरू करना चाहता है, न केवल पहले एक, लेकिन यह मेरे लिए उपयोगी था।
क्रिस्टोफर जॉनसन

1
दो झंडों को जानना अच्छा है, मेरा मामला उनके बिना कुछ भी नहीं करने के लिए लग रहा था।
ओवेन बी

1
यह आपके लिए धन्यवाद काम किया! भगवान आपका भला करे ।
विवेक

16

भले ही इसका उत्तर कई बार दिया गया हो।

यदि किसी खंड से किसी गतिविधि को फिर से शुरू करना है, तो मैं इसे इस तरह से करूंगा:

new Handler().post(new Runnable() {

         @Override
         public void run()
         {
            Intent intent = getActivity().getIntent();
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
            getActivity().overridePendingTransition(0, 0);
            getActivity().finish();

            getActivity().overridePendingTransition(0, 0);
            startActivity(intent);
        }
    });

तो आप सोच रहे होंगे कि यह थोड़ा ओवरकिल है? लेकिन Handlerपोस्टिंग आपको इसे जीवन चक्र विधि में कॉल करने की अनुमति देता है। मैंने यह जाँचने के लिए इन विधियों onRestart/ onResumeविधियों का उपयोग किया है कि ऐप में वापस आने वाले उपयोगकर्ता के बीच स्थिति बदल गई है या नहीं। (कुछ स्थापित)।

बिना Handlerअगर आप एक अजीब जगह में इसे कहते यह सिर्फ गतिविधि मार डालेगा और उसे दोबारा शुरू नहीं।

आप कोई भी प्रश्न पूछ सकते हैं।

चीयर्स, क्रिस


2
महान समाधान और हैंडलर के लिए बहुत अच्छा तर्क / स्पष्टीकरण।
JRomero

1
आप "ओवरराइडिंग ट्रेंड्रिशन" को दो बार क्यों कहते हैं?
Android डेवलपर

1
@androiddeveloper मुझे याद नहीं है, मुझे लगता है कि यह बग के आसपास का काम था। आप इसे शुरू होने से पहले एक बार कॉल कर सकते हैं () और यह जैसा बताया जाएगा।
क्रिस। जेनकिंस

मेरे onResume फ़ंक्शन में इसे लागू करने के बाद, गेम मेरे onStop विधि पर बंद हो जाता है और एक काली स्क्रीन होती है ... निश्चित नहीं कि क्यों
Scumble373

1
हाय क्रिस, क्या आप इसे थोड़ा आगे समझा सकते हैं "हैंडलर के बिना यदि आप इसे एक विषम जगह में कहते हैं तो यह सिर्फ गतिविधि को मार देगा और इसे पुनः आरंभ नहीं करेगा।" ?
परवेज़ रफ़ी

15

वैसे यह सूचीबद्ध नहीं है लेकिन कुछ का एक कॉम्बो जो पहले से ही पोस्ट किया गया है:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}

यह मेरे लिए काम करता है .. धन्यवाद .. लेकिन मैं आपसे पूछना चाहता हूं: जब मैं कोड के पहले भाग को हटाता हूं (वह जो एसडीके_एएनटी की जांच करता है) मेरा ऐप अपेक्षाकृत, धीमा चलता है? !! .. जब मैं फिर से कोड को फिर से संलग्न करता हूं, तो यह अपेक्षाकृत और स्पष्ट रूप से चलता है, बहुत तेज !!!
मैक्लेन

2
उस पर यकीन नहीं है। ठीक है, यदि आप एक SDK का उपयोग कर रहे हैं जो है = = 11 तो फिर से बनाना () इरादे, परिष्करण, फिर से इसे शुरू करने से तेज होना चाहिए। कॉल कोड को समाप्त करें जो onStop पर चलता है और ओरिएंटेशन परिवर्तन की तरह कोड चलाता है ... तो यह करने के लिए काफी नहीं है।
कोड

4

कैमरे के साथ अजीब SurfaceView जीवन चक्र व्यवहार के संयोजन में । मैंने पाया है कि रीक्रिएट () भूतल व्यू के जीवनचक्र के साथ अच्छा व्यवहार नहीं करता है। सतह चक्र को कभी भी मनोरंजन चक्र के दौरान नहीं बुलाया जाता है। इसे onResume (अजीब) के बाद कहा जाता है, जिस बिंदु पर मेरा SurfaceView नष्ट हो गया है।

किसी गतिविधि को फिर से बनाने का मूल तरीका ठीक काम करता है।

Intent intent = getIntent();
finish();
startActivity(intent);

मैं ठीक-ठीक पता नहीं लगा सकता कि यह क्यों है, लेकिन यह सिर्फ एक अवलोकन है जो भविष्य में दूसरों का मार्गदर्शन कर सकता है क्योंकि यह मेरी समस्याओं को तय करता है जो मैं सर्फेस व्यू के साथ कर रहा था


4

मुझे आश्चर्य है कि क्यों किसी ने उल्लेख नहीं किया है Intent.makeRestartActivityTask()जो सफाई से यह सटीक उद्देश्य बनाता है।

एक ऐसी आशय बनाएँ जिसका उपयोग किसी अनुप्रयोग के कार्य को फिर से शुरू करने के लिए किया जा सकता है।

startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent()));

यह विधि Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASKडिफ़ॉल्ट झंडे के रूप में सेट होती है ।


3

वास्तव में निम्न कोड API स्तर 5 और उसके बाद के लिए मान्य है, इसलिए यदि आपका लक्ष्य API इससे कम है, तो आप EboMike के कोड के साथ कुछ समान करेंगे।

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);

3

एक हैक करने का तरीका है जिसमें मुख्य सहित किसी भी गतिविधि पर काम करना चाहिए।

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

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


3
public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

इस का उपयोग करने की कोशिश करो ..


3

आपके प्रश्न का हल है:

public static void restartActivity(Activity act){
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    ((Activity)act).startActivity(intent);
    ((Activity)act).finish();
}

नई गतिविधि शुरू करने के लिए और वर्तमान गतिविधि को समाप्त करने के लिए आपको गतिविधि के संदर्भ में जाने की आवश्यकता है।

आशा है कि यह उपयोगी..और मेरे लिए काम करता है।


1

यदि आप अंतिम पंक्ति को हटाते हैं, तो आप नई actगतिविधि बनाएंगे , लेकिन आपका पुराना उदाहरण अभी भी जीवित रहेगा।

क्या आपको गतिविधि को फिर से शुरू करने की आवश्यकता है जैसे कि अभिविन्यास बदला जाता है (यानी आपका राज्य सहेजा और पास किया गया है onCreate(Bundle))?

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

यदि आपको अधिकांश राज्य को बचाने की आवश्यकता है, तो आप बहुत गहरे पानी में जा रहे हैं, क्योंकि यह आपके राज्य के सभी गुणों को पारित करने के लिए गैर-तुच्छ है, विशेष रूप से अपने पुराने संदर्भ / गतिविधि को लीक किए बिना, इसे नए उदाहरण में पारित करके।

कृपया, निर्दिष्ट करें कि आप क्या करने की कोशिश कर रहे हैं।


1
मेरे पास एक बटन है जो ऐप पर विभिन्न विषयों को लागू करता है, विषय लागू होने के बाद, यह वरीयता में सहेजा जाता है, रूट गतिविधि फिर से शुरू होती है, प्राथमिकता से विषय को पढ़ता है, थीम को ऑनक्रिएट () में लागू करता है। यह पता चला है कि यदि गतिविधि single_instance नहीं है तो उपरोक्त कोड ठीक काम करता है। यकीन नहीं होता है कि यह सबसे अच्छा अभ्यास है।

वर्तमान में, आपकी गतिविधि, AFAIK को पुनः आरंभ करने के लिए कोई साफ-सुथरा, SDK-paved तरीका नहीं है - यदि आप कुछ भी लीक नहीं करते हैं, तो आप जाने के लिए अच्छा हो सकता है :)
Dimitar Dimitrov

0

इस तरह से मैं यह कर रहा हूँ।

        val i = Intent(context!!, MainActivity::class.java)
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        startActivity(i)

-1

यदि आप कुछ खंड से कॉल कर रहे हैं तो कोड से नीचे करें।

Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);

-4

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

onRestart ()

विधि इस प्रकार है

 @Override
    protected void onRestart() {
        super.onRestart();
        setContentView(R.layout.add_entry);
    }

और onRestart () को कॉल करें जहां आप वर्तमान गतिविधि को फिर से शुरू करना चाहते हैं


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