एंड्रॉइड: बैक स्टैक को साफ़ करें


330

एंड्रॉइड I में कुछ गतिविधियां हैं, आइए A, B, C कहते हैं।

A में, मैं B को खोलने के लिए इस कोड का उपयोग करता हूं:

Intent intent = new Intent(this, B.class);
startActivity(intent);

बी में, मैं सी खोलने के लिए इस कोड का उपयोग करता हूं:

Intent intent = new Intent(this, C.class);
startActivity(intent);

जब उपयोगकर्ता सी में एक बटन टैप करता है, तो मैं ए पर वापस जाना चाहता हूं और बैक स्टैक (बी और सी दोनों को बंद करना) को साफ करना चाहता हूं। इसलिए जब उपयोगकर्ता बैक बटन B और C का उपयोग नहीं करेगा, तो मैं निम्नलिखित प्रयास कर रहा हूं:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

लेकिन B और C अभी भी दिखा रहे हैं कि जब मैं गतिविधि में वापस आता हूं तो बैक बटन का उपयोग करता हूं। मैं इससे कैसे बच सकता हूं?

जवाबों:


438

इसके FLAG_ACTIVITY_NEW_TASKलिए डॉक्स में बताए अनुसार जोड़ने का प्रयास करें FLAG_ACTIVITY_CLEAR_TOP:

इस लॉन्च मोड का उपयोग FLAG_ACTIVITY_NEW_TASK के साथ संयोजन के रूप में अच्छे प्रभाव के लिए भी किया जा सकता है: यदि किसी कार्य की जड़ गतिविधि शुरू करने के लिए उपयोग की जाती है, तो यह उस कार्य के किसी भी वर्तमान में चल रहे उदाहरण को अग्रभूमि में लाएगा, और फिर इसे अपनी मूल स्थिति में साफ़ कर देगा। यह विशेष रूप से उपयोगी है, उदाहरण के लिए, जब अधिसूचना प्रबंधक से एक गतिविधि शुरू करना।

तो आपका लॉन्च करने का कोड Aहोगा:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
CurrentActivity.this.finish(); // if the activity running has it's own context


// view.getContext().finish() for fragments etc.

28
धन्यवाद, लेकिन मैंने यह कोशिश की है। फिर भी जब मैं बैक बटन को टैप करता हूं उसके बाद फिर से सी दिखाता है। मुझे क्या याद आ रही है?
मार्टिन

4
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
dzeikei

8
हालांकि सोर्स
एक्ट

10
मुझे एक ही समस्या थी कि यह काम नहीं कर रहा था। नई गतिविधि शुरू करने के बाद मेरे लिए कॉल को खत्म करना () तय था
अर्नो

20
मैंने एक और स्पष्ट इरादे को भी जोड़ा = नया इरादा (SingUpActivity.this, LoginActivity.class); आशय .setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity (आशय); समाप्त();
सैम

147
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

8
CLEAR_TOPध्वज के सभी सम्मान के साथ - यह संयोजन केवल एक ही है जिसने पूरी तरह से पूरे ढेर को साफ कर दिया है और नई गतिविधि को ऐप में केवल एक बना दिया है। धन्यवाद!
अवील ग्रॉस

8
इस और स्वीकृत उत्तर के बीच क्या अंतर है?
यूरी हूपा

7
धन्यवाद, स्वीकार किए गए उत्तर के साथ अंतर यह है कि इस झंडे के साथ हमें गतिविधि कॉल करने की आवश्यकता नहीं है।
फ़िनिश

1
FLAG_ACTIVITY_CLEAR_TASK ने NEW_TASK के साथ मिलकर पूरी तरह से काम किया
साजिब

1
यह स्वीकृत उत्तर होना चाहिए। आपका बहुत बहुत धन्यवाद।
एमडी दानिश अंसारी

77

संबंधित गतिविधि के लिए मैनिफ़ेस्ट फ़ाइल में जोड़ने के बारे में क्या:

android:noHistory="true"

B और C की गतिविधि की परिभाषा क्या है? उन्हें बैकस्ट में नहीं जोड़ा जाएगा। यकीन नहीं तो वही करें जो आप चाहते हैं।


3
इसका उपयोग करते समय बहुत सावधान रहें - यदि आप एफबी या किसी भी तरह की कार्यक्षमता के साथ लॉगिन का उपयोग कर रहे हैं
स्काईनेट

2
@Skynet क्यों? ऐसा करने से जुड़ी समस्याएं क्या हैं?
अल्फी वुडलैंड

8
जब आप nohistory के साथ एक पृष्ठ से लॉगिन करने के लिए FB पर नियंत्रण को सही मानते हैं, तो FB ऐप अब उपयोगकर्ता को लॉग इन करने के बाद कहां उतरना है, मेरे मामले में यह फोन होम स्क्रीन पर लौट रहा था और मैंने लगभग अपना काम खो दिया था!
स्काईनेट

यह एक गतिविधि को बैकस्टैक करने की अनुमति नहीं देता है .... यह सही समाधान नहीं है।
तरुण

बिल्कुल मैं देख रहा हूँ
मासुम

63

यह मुझे लंबे समय तक परेशान करता है। आमतौर पर मैंने ऐसा करके इसे काम किया:

टुकड़े में, उपयोग करें:

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

गतिविधि में, उपयोग करें ( Intent.FLAG_ACTIVITY_CLEAR_TASKटुकड़े की तुलना में एक और आशय का झंडा जोड़ें ):

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

1
यदि आप androidannotations का उपयोग कर रहे हैं, तो आपको जोड़ना होगा: Intent.FLAG_ACTIVITY_CLEAR_TASK
yosafatade

गतिविधि solutioin ने मेरे लिए ठीक काम किया। हालांकि मुझे लगता है कि एपीआई 16 के साथ डैनियल शुलर का समाधान आसान है।
फिलिपिन्स

धन्यवाद, योसाफ़ातडे, यही मैं याद कर रहा था!
मार्टी मिलर

30
  1. android:launchMode="singleTop"गतिविधि A के लिए अपनी उपस्थिति में गतिविधि तत्व में जोड़ें
  2. तब गतिविधि ए का उपयोग करें intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) और intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)शुरू करें

इसका मतलब यह है कि जब गतिविधि ए लॉन्च की जाती है, तो उसके शीर्ष पर सभी कार्यों को मंजूरी दे दी जाती है ताकि ए शीर्ष हो। रूट पर A के साथ एक नया बैक स्टैक बनाया गया है, और singleTopयह सुनिश्चित करता है कि आप केवल A को एक बार लॉन्च करें (क्योंकि A अब शीर्ष पर है ..._CLEAR_TOP)।


3
हाँ। यह वही है जो मैं अभी उपयोग कर रहा हूं लेकिन यह ऐसा नहीं करता है। फिर भी जब मैं बैक बटन दबाता हूं तो C दिखाता है।
मार्टिन

अजीब, मैंने एक परियोजना में इसका इस्तेमाल किया और यह ठीक काम करता है ... वापस दबाने से मुझे होम स्क्रीन पर ले जाता है। शायद कुछ और ही चल रहा है। क्या आप अपनी अभिव्यक्ति पोस्ट कर सकते हैं?
जोसफ अर्ल

मैंने एमुलेटर को फिर से शुरू किया और अब यह ठीक उसी तरह काम कर रहा है जैसा आपने कहा था। आपकी सहायता के लिए धन्यवाद!
मार्टिन

स्टैक को साफ करने के साथ सिंगलटॉप का कोई लेना देना नहीं होना चाहिए।
स्टडआउट

29

एपीआई 16 (जेली बीन) में शुरू, आप बस कॉल कर सकते हैं finishAffinity()

अब आप ActivityCompat.finishAffinity(Activity activity)संगतता पुस्तकालय के साथ भी कॉल कर सकते हैं ।

गतिविधियों के उस समूह के लिए विशिष्ट पैकेज नाम के प्रकट में टास्कऑफ़िनिटी सेट करना सुनिश्चित करें।

अधिक जानकारी के लिए देखें:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29


वास्तव में उपयोगकर्ता और आसान समाधान अगर आप एपीआई 16 पर भयभीत हैं। मेरे लिए काम किया!
फिलिपिंस

3
रिमाइंडर: यह केवल उसी कार्य में गतिविधियों के लिए काम करेगा, जो समान कार्य का नाम है
रयान

यह केवल तभी काम करता है जब आपके पास इतिहास में सिर्फ एक गतिविधि हो।
arsent


11

यदि आपके आवेदन में न्यूनतम sdk संस्करण 16 है तो आप फिनिश का उपयोग कर सकते हैं ()

इस गतिविधि को समाप्त करें और साथ ही साथ वर्तमान कार्य में इसके नीचे की सभी गतिविधियाँ समान आत्मीयता के साथ समाप्त करें।

यह मेरे लिए काम है शीर्ष भुगतान स्क्रीन में सभी बैक-स्टैक एक्टिविटीज को हटा दें,

 @Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29



8

भविष्य के अनुसंधान के लिए, इस कोड का प्रयास करें।

Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

इन झंडों ने आखिरकार मेरे लिए काम किया। मैंने जो किया था, मैंने वही गतिविधि शुरू की थी जो मैं इन झंडों और एक बूलियन अतिरिक्त EXIT = सच के साथ कर रहा था। OnCreate () में मैंने EXIT के लिए लॉन्च मापदंडों की जाँच की और इसे सही कहा गया तो फिनिश () कहा जाता है। बस अपने खुद के ऐप को बंद करने के लिए यह बहुत परेशानी है।
Janne Oksanen

8

फिनिशएफ़िनिटी () का उपयोग करें; कार्य सी में जब बैकस्टैक गतिविधियों को स्पष्ट करने के लिए कार्य ए शुरू करना।


केवल यही उत्तर मेरे लिए काम करता है। Intent.FLAG_ACTIVITY_CLEAR_TOP और Intent.FLAG_ACTIVITY_NEW_TASK की आवश्यकता नहीं है
Nuttynibbles

7

नई गतिविधि शुरू करने के लिए इस कोड का उपयोग करें और अन्य सभी गतिविधि स्टैक या बैक स्टैक को बंद करें या नष्ट करें।

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

5
Use finishAffinity() to clear all backstack with existing one.

Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, 

    - Activity B will be finished / removing from stack.
    - Activity A will be finished / removing from stack.
    - Activity C will finished / removing from stack.

5

मुझे एक दिलचस्प समाधान मिला, जो मदद कर सकता है। मैंने अपने onBackPressed()तरीके से ऐसा किया।

finishAffinity();
finish();

FinishAffinityमौजूदा गतिविधि के कनेक्शन को उसके स्टैक से निकालता है। और फिर फिनिश आपको उस गतिविधि से बाहर निकलने में मदद करता है। जो अंततः आवेदन से बाहर निकल जाएगा।


4

मुझे यहाँ उत्तर थोड़े भ्रामक लगे क्योंकि मूल प्रश्न में कोड मेरे लिए ठीक काम करता है?

A की मूल गतिविधि होने के नाते, इसे B या C से शुरू करके केवल FLAG_ACTIVITY_CLEAR_TOP से बी और सी को पीछे के स्टैक से हटा दिया जाता है।


4

कोटलिन में यह लगभग जावा की तरह ही होता है। केवल | प्रतीक का स्थान पाठ या पाठ द्वारा लिया जाता है । तो, यह इस तरह लिखा है-

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)

3

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

घोषित Activity Aरूप में SingleTopउपयोग करके [android:launchMode="singleTop"]Android मेनिफेस्ट में।

अब Aकहीं से भी लॉन्च करते समय निम्नलिखित झंडे जोड़ें । यह ढेर को साफ कर देगा।

Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();

2

Intent.FLAG_ACTIVITY_CLEAR_TOPइस मामले में काम नहीं करेगा। इस्तेमाल करें(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

अधिक विवरण के लिए कृपया इस दस्तावेज़ को देखें।


2

यह मुझे लगता है जैसे आपको उपयोग करने Activity Cसे शुरू करने की आवश्यकता है । जब आप एक बटन क्लिक करते हैं , तो कॉल करें और ऐसा ही समाप्त हो जाए। इसमें , आप स्वयं भी कॉल करके प्रतिक्रिया दे सकते हैं , और फिर आपको वापस ले जाया जाएगा ।Activity BstartActivityForResult()Activity CsetResult(RESULT_OK)finish()Activity CActivity BonActivityResult()finish()Activity A


7
हां, लेकिन अगर ए और सी के बीच 42 गतिविधियां हैं, तो यह थकाऊ होगा। फ्लैग FLAG_ACTIVITY_CLEAR_TOP को सीधे वही करना चाहिए जो ओपी चाहता है।
गिलियूम ब्रूनरी

यह ओपी जो चाहता है उसे प्राप्त करने के इष्टतम तरीके से कम होगा, और @Guillaume ने कहा, इसे रूट और स्टैक के बीच की सभी गतिविधियों में कोड की आवश्यकता होगी।
जेक बेसिल

विधिवत् नोट किया हुआ। ये वे झंडे हैं जिनके बारे में मुझे स्पष्ट रूप से जानने की जरूरत है।
मैक्सिमस


1

आप इस उदाहरण का उपयोग कर सकते अपने कॉल करने के लिए Activity AसेActivity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);


1

मेरे Intent.FLAG_ACTIVITY_CLEAR_TASKलिए समस्या को हल करना जोड़ना

Intent i = new Intent(SettingsActivity.this, StartPage.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP  | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
finish();

1

उन्नत, पुन: प्रयोज्य Kotlin:

आप सेटर विधि का उपयोग करके सीधे ध्वज सेट कर सकते हैं। Kotlin में orहै प्रतिस्थापन जावा बिटवाइज़ या के लिए |

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK

यदि यह एक से अधिक बार उपयोग किया जाता है, तो एक इंटेंट एक्सटेंशन फ़ंक्शन बनाएं

fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

फिर आप इरादे शुरू करने से पहले सीधे इस फ़ंक्शन को कॉल कर सकते हैं

intent.clearStack()

यदि आपको अन्य स्थितियों में अतिरिक्त झंडे जोड़ने के विकल्प की आवश्यकता है, तो एक्सटेंशन फ़ंक्शन में एक वैकल्पिक परम जोड़ें।

fun Intent.clearStack(additionalFlags: Int = 0) {
    flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

0

इसके अलावा FLAG_ACTIVITY_CLEAR_TOP, आप के Intent.FLAG_ACTIVITY_SINGLE_TOPरूप में अच्छी तरह से जोड़ने की कोशिश कर सकते हैं :

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


यह केवल स्टैक के शीर्ष पर गतिविधि को प्रभावित करेगा, इसकी जड़ नहीं।
जेक बेसिल

0

दिया गया कोड सही तरीके से काम करता है। मैंने एप्लीकेशन लाइफ साइकिल के नमूने में कोशिश की है।

फ्लैग, FLAG_ACTIVITY_CLEAR_TOP के साथ गतिविधि A शुरू करने के बाद मुझे B और C वापस नहीं मिले


0

मैंने activity_name.this.finish()नया इरादा शुरू करने के बाद फोन किया और यह मेरे लिए काम कर गया।

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

लेकिन यह मेरे लिए काम नहीं करेगा ... मैं उपयोग के लिए इस समाधान का सुझाव नहीं दे रहा हूं, लेकिन यदि ध्वज स्थापित करना आपके लिए काम नहीं करेगा, तो आप इस कोशिश कर सकते हैं..लेकिन फिर भी मैं इसका उपयोग नहीं करने की सलाह देता हूं


0

इरादे में कोई इतिहास झंडा जोड़ें।

गतिविधि B में, गतिविधि C को नीचे >>>>>> के रूप में शुरू करें

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();

0

प्रकट में

android:launchMode="singleTask"

तथा

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

0

या तो इसे अपने Activity Bऔर जोड़ेंActivity C

android:noHistory="true"

या Override onBackPressedसमारोह के साथ वापस दबाने से बचने के लिए एक return

@Override
public void onBackPressed() {
   return;
}

0

सेटफ्लैग्स का उपयोग करें () स्पष्ट बैक साइड के लिए विधि ने सभी गतिविधि को बंद कर दिया और अपनी शुरुआत शुरू करें

Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.