एक गतिविधि को दूसरी गतिविधि से समाप्त करें


101

मैं एक गतिविधि को दूसरी गतिविधि से समाप्त करना चाहता हूं, जैसे:

गतिविधि [ए] में, बटन क्लिक करने पर, मैं गतिविधि [ए] को समाप्त किए बिना गतिविधि [बी] कह रहा हूं।

अब गतिविधि [बी] में, दो बटन हैं, नया और संशोधित । जब उपयोगकर्ता संशोधित पर क्लिक करता है तो स्टैक से एक गतिविधि [ए] को सभी विकल्पों के साथ टिक करें।

लेकिन जब उपयोगकर्ता गतिविधि [बी] से नए बटन पर क्लिक करता है , तो मुझे स्टैक से गतिविधि [ए] को समाप्त करना होगा और उस गतिविधि को फिर से लोड करना होगा [ए] फिर से स्टैक में।

मैं यह कोशिश कर रहा हूं, लेकिन मैं स्टैक से गतिविधि [ए] को समाप्त करने में सक्षम नहीं हूं ... मैं यह कैसे कर सकता हूं?

मैं कोड का उपयोग कर रहा हूं:

गतिविधि [ए] से:

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);

उसी गतिविधि में एक और तरीका

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == 1)
    {
        if (resultCode == 1) {
            Intent i = getIntent();
            overridePendingTransition(0, 0);
            i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();

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

और गतिविधि [बी] में, बटन पर क्लिक करें:

setResult(1);
finish();

हे, आप एक गतिविधि को दूसरे अधिकार से समाप्त करना चाहते थे ... तब मैंने उत्तर पोस्ट किया था जो सही है। लेकिन, आपने इसे वोट क्यों दिया?
मंजूनाथ

यहाँ कुछ अच्छे उत्तरों के साथ एक सूत्र है: stackoverflow.com/questions/14355731/…
ab

जवाबों:


189
  1. अपनी गतिविधि A को प्रकट फ़ाइल में बनाएँ: launchMode = "singleInstance"

  2. जब उपयोगकर्ता नया क्लिक करता है, तो FirstActivity.fa.finish();नया इंटेंट करें और कॉल करें।

  3. जब उपयोगकर्ता क्लिक करता है, तो नया आशय कॉल करें या गतिविधि बी समाप्त करें।

पहला रास्ता

अपनी पहली गतिविधि में, एक Activity objectको इस तरह घोषित करें,

public static Activity fa;
onCreate()
{
    fa = this;
}

अब Activityइस तरह की वस्तु का उपयोग दूसरी गतिविधि को समाप्त करने के लिए करें।

onCreate()
{
    FirstActivity.fa.finish();
}

दूसरा रास्ता

अपनी गतिविधि को कॉल करते समय FirstActivityजिसे आप समाप्त करना चाहते हैं जैसे ही आप आगे बढ़ते हैं, आप कॉल करते समय ध्वज जोड़ सकते हैंFirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

लेकिन इस झंडे के उपयोग से गतिविधि समाप्त हो जाएगी, जो आप चाहते हैं कि यह नहीं हो। और किसी समय onBackयदि आप दिखाना चाहते हैं तो आपको FirstActivityइरादे का उपयोग करके इसे कॉल करना होगा।


6
बहुत बढ़िया जवाब..!!
वैभव वजनी

93
आप किसी गतिविधि का एक स्थिर संदर्भ रख रहे हैं। जब तक आप इसे कहीं से मैन्युअल रूप से साफ़ नहीं करेंगे तब तक यह कभी नहीं जाएगा -> आप एक मेमोरी लीक बना रहे हैं!
DArkO

5
ठीक है, ठीक है, आपके पास आउट-ऑफ-द-बॉक्स सोच के लिए मेरा +1 है: डी, ​​मैं सिर्फ सिंगलटॉप में बदलूंगा। हालांकि यह तब भी मेरी पहली पसंद नहीं होगा जब कुछ ऐसा ही कर रहा हो। क्लीनअप कोड से मेरा मतलब था कि स्टैटिक रेफरेंस से छुटकारा पाने का एक तरीका है ताकि कोई मेमोरी लीक न हो, लेकिन यह ऐप स्ट्रक्चर पर निर्भर करता है।
डीएआरकेओ

6
कृपया पहले समाधान का उपयोग न करें, यह पूरी तरह से गलत है। आप एक ज़ोंबी वस्तु बनाने के दौरान वास्तव में हैक करने के तरीके में एंड्रॉइड ढांचे को दरकिनार कर रहे हैं। एक ब्रॉडकास्टर का उपयोग करें।
एस-के '

1
बहुत बढ़िया समाधान। अपनी समस्या के लिए बहुत अच्छी तरह से काम किया है जिसमें मैं ए-> बी-> सी से चल रहा था और सी के ऑनबैक में, मैं बी का नया उदाहरण लॉन्च कर रहा था लेकिन अगर मैंने बी के उस नए उदाहरण पर ऑनबैक किया तो इसका उपयोग किया गया। A के पुराने उदाहरण के बजाय B के पुराने उदाहरण पर जाएं (जो मैं चाहता था)। इसलिए मैंने C के onBackPressed में आपकी पहली विधि का पालन किया, और इसने मुझे वह व्यवहार दिया, जो मैं चाहता था :) धन्यवाद एक टन :)
सोलरडर

87

आप ऐसा कर सकते हैं, लेकिन मुझे लगता है कि आपको गतिविधि के सामान्य प्रवाह को नहीं तोड़ना चाहिए। यदि आप गतिविधि समाप्त करना चाहते हैं तो आप अपनी गतिविधि B से गतिविधि A में प्रसारण भेज सकते हैं।

अपनी गतिविधि B शुरू करने से पहले एक प्रसारण रिसीवर बनाएं:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equals("finish_activity")) {
            finish();
            // DO WHATEVER YOU WANT.
        }
    }
};
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity"));

गतिविधि B से गतिविधि A पर प्रसारण भेजें जब आप B से गतिविधि A समाप्त करना चाहते हैं

Intent intent = new Intent("finish_activity");
sendBroadcast(intent);

मुझे उम्मीद है कि यह आपके लिए काम करेगा ...


यह इस त्रुटि को दिखाता है "सिंटेक्स त्रुटि टोकन पर, एनोटेशननाम इसके बजाय" रजिस्टररसीवर (प्रसारण_क्रिसिवर, नई इंटेंटफिल्टर ("फिनिश_एक्टीविटी")); "। क्या गलत है?
बेहजाद

2
"इसके लिए आपको गतिविधि का सामान्य प्रवाह नहीं तोड़ना चाहिए" +1
S-K '

11
broadcast_receiverunregisterReceiver()
Jaec


यह उपाय है। अच्छा एक
परिंदा राजपक्ष

17

यह एक काफी मानक संचार प्रश्न है। एक एक्टिविटी ए में रिजल्टसीवर का उपयोग करने के लिए एक दृष्टिकोण होगा:

Intent GotoB=new Intent(A.this,B.class);
GotoB.putExtra("finisher", new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        A.this.finish();
    }
});
startActivityForResult(GotoB,1);

और फिर एक्टिविटी बी में आप इसे मांग की तरह पूरा कर सकते हैं:

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());

कुछ ऐसा प्रयास करें।


6
+1 बस, (ResultReceiver) getIntent ()। GetParcelableExtra ("फिनिशर")) भेजें। (1, नया बंडल ());
हमीद्रेजा साडेग

12

एक दृष्टिकोण है जिसे आप अपने मामले में उपयोग कर सकते हैं।

चरण 1: गतिविधि ए से गतिविधि बी शुरू करें

startActivity(new Intent(A.this, B.class));

चरण 2: यदि उपयोगकर्ता संशोधित बटन पर क्लिक करता है FLAG_ACTIVITY_CLEAR_TOP, तो .A का उपयोग करके गतिविधि शुरू करें , ध्वज को अतिरिक्त रूप से पास करें।

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "modify");
startActivity(i);
finish();

Step3: यदि उपयोगकर्ता ऐड बटन पर क्लिक करता है FLAG_ACTIVITY_CLEAR_TOP, तो .A का उपयोग करके गतिविधि शुरू करें , ध्वज को अतिरिक्त रूप से पास करें। FLAG_ACTIVITY_CLEAR_TOPलक्ष्य तक की सभी खुली हुई गतिविधियों को साफ़ कर देगा और यदि लक्ष्य गतिविधि में कोई लॉन्च मोड परिभाषित नहीं होता है, तो पुनः आरंभ करें

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "add");
startActivity(i);
finish();

चरण 4: अब onCreate()गतिविधि ए की विधि, उस ध्वज को पुनः प्राप्त करने की आवश्यकता है।

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}


5

स्टैक ओवरफ्लो प्रश्न का मेरा उत्तर देखें पिछली सभी गतिविधियों को समाप्त करें

आपको जो कुछ भी चाहिए वह जोड़ना है Intent.FLAG_CLEAR_TOP। यह ध्वज सुनिश्चित करता है कि स्टैक में लक्षित गतिविधि से ऊपर की सभी गतिविधियाँ समाप्त हो गई हैं और एक दिखाया गया है।

एक और चीज जिसकी आपको जरूरत है SINGLE_TOP झंडा। इसके साथ आप Android को एक नई गतिविधि बनाने से रोकते हैं यदि स्टैक में पहले से ही एक बना है।

बस सावधान रहें कि यदि गतिविधि पहले से ही बनाई गई थी, तो लक्ष्य गतिविधि में इन झंडों के साथ इरादे को बुलाया गया तरीका onNewIntent(intent)(आपको इसे संभालने के लिए इसे ओवरलोड करने की आवश्यकता है) में वितरित किया जाएगा ।

फिर onNewIntentआपके पास एक विधि है जिसे पुनरारंभ या कुछ finish()और कहा जाता है जो कॉल करेगा और अपने आप में एक नया इरादा लॉन्च करेगा , या एक ऐसा repopulate()तरीका होगा जो नया डेटा सेट करेगा। मैं दूसरा दृष्टिकोण पसंद करता हूं, यह कम खर्चीला है और आप हमेशा onCreateतर्क को एक अलग विधि में निकाल सकते हैं जिसे आप आबाद करने के लिए कह सकते हैं।


4

मैंने अभी-अभी नेप्स्टर का समाधान लागू किया है और आकर्षण की तरह काम करता है। एक फ्रैगमेंट से इसे चलाने के लिए एक मामूली संशोधन है।

आपके टुकड़े करने के लिए

// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("transparent_nav_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

और गतिविधि के अपने OnNewIntent () को आप पुनः आरंभ करना चाहेंगे।

// recreate activity when transparent_nav was just changed
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) {
    finish(); // finish and create a new Instance
    Intent restarter = new Intent(MainActivity.this, MainActivity.class);
    startActivity(restarter);
}

2

मुझे लगता है कि मेरे पास सबसे आसान तरीका है ... बी में नया दबाने पर।

Intent intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

और ए में मिलता है

  if (getIntent().getBooleanExtra("NewClicked", false)) {
        finish();// finish yourself and make a create a new Instance of yours.
      Intent intent = new Intent(A.this,A.class);
      startActivity(intent);
    }

1

मुझे पता है कि यह एक पुराना सवाल है, इनमें से कुछ तरीके मेरे लिए काम नहीं करते थे, ताकि भविष्य में किसी को भी मेरी परेशानी का सामना करना पड़े या मेरे लिए यह मुसीबत काम आए।

मैंने ओवररोड किया onPauseऔर finish()उस तरीके से अंदर बुलाया ।


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