एंड्रॉइड: पिछली सभी गतिविधियों को बैक स्टैक से निकालें


119

जब मैं अपनी प्रोफ़ाइल गतिविधि में लॉगआउट बटन पर क्लिक कर रहा हूं, तो मैं उपयोगकर्ता को लॉगिन पृष्ठ पर ले जाना चाहता हूं , जहां उसे नए क्रेडेंशियल्स का उपयोग करने की आवश्यकता है।

इसलिए मैंने इस कोड का उपयोग किया:

Intent intent = new Intent(ProfileActivity.this,
        LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

में onButtonClickलॉगआउट बटन की।

लेकिन समस्या यह है कि जब मैं लॉगिन गतिविधि पर डिवाइस बैक बटन पर क्लिक करता हूं तो यह मुझे प्रोफाइलएक्टिविटी तक ले जाता है। मैं उम्मीद कर रहा था कि जब मैं LoginActivity पर डिवाइस बैक बटन दबाऊँ तो एप्लिकेशन बंद होना चाहिए।

मैं क्या गलत कर रहा हूं?

मैंने android:launchMode="singleTop"अपनी LoginActivity के लिए मेनिफेस्ट में भी जोड़ा

धन्यवाद


@GauravVashisth मैं सिर्फ इस समाधान पीछा कर रहा था stackoverflow.com/questions/5794506/...
Archie.bpgc

@ abbas.aniefa यह समाधान मैं थोड़ा जटिल है। कि सभी वापस ढेर को साफ करने का एकमात्र तरीका है। क्योंकि मेरे पास 30+ गतिविधियाँ हैं, इसलिए मुझे उन सभी के लिए यह प्रसारण कोड लिखना चाहिए
Archie.bpgc

इसके बाद प्रयास करें, stackoverflow.com/questions/10961481/… । प्रसारण का उपयोग करना एक बेहतर उपाय है।
abbas.aniefa

एक और दृष्टिकोण जिसे आप लॉगआउट के लिए उपयोग कर सकते हैं, एक बार जब आप लॉगआउट को साझा करने के लिए एक साझाकरण और प्रत्येक onRestart () पद्धति में किसी गतिविधि की विधि से आप इस चर मान की जांच कर सकते हैं यदि यह सही है तो आप वर्तमान गतिविधि को समाप्त कर सकते हैं। कोई फर्क नहीं पड़ता कि बैकग्राउड में कितनी गतिविधियां खुली हैं। इससे आपकी सारी गतिविधि समाप्त हो जाएगी।
हिरेन दबी

आपका मूल कोड वास्तव में एपीआई स्तर 11 के लिए या एक ट्वीक के साथ अधिक से अधिक काम करता है। आपको बस एक ही कॉल में एक साथ झंडे लगाने की जरूरत है: intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);मुझे इस सवाल का जवाब मिला: stackoverflow.com/questions/3473168/…
jokeefe

जवाबों:


303

यहाँ प्रस्तावित समाधान ने मेरे लिए काम किया:

जावा

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

Kotlin

val i = Intent(this, NewActivity::class.java)
// set the new task and clear flags
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(i)

हालाँकि, इसके लिए API स्तर> = 11 आवश्यक है।


दोस्तों, के प्रलेखन को पढ़ें FLAG_ACTIVITY_CLEAR_TASK। यह आधिकारिक तरीका है। ऐप में सभी गतिविधियों को बदलने की आवश्यकता नहीं है।
एलिकएल्ज़िन-किलाका

यह सूचनाओं के लिए काम नहीं करता है stackoverflow.com/questions/24873131/…
सैम

मेरे पास मेरा मिनी = 16 है, इसलिए यह मेरे लिए बिल्कुल ठीक काम कर रहा है। हालाँकि, मैंने देखा कि दृश्य निष्पादन एपीआई> 21 के साथ थोड़ा सुस्त है और एपीआई <21 के साथ चिकना है। किसी को भी एक ही समस्या का अनुभव?
रेड एम

1
यह गतिविधियों के लिए एक नया कार्य बनाएगा
रोहित

@kgiannakakis कोई संदेह समाधान काम नहीं कर रहा है यदि हमारे पास केवल एक कार्य (गतिविधि बैक स्टैक) है, लेकिन जब हमारे पास कई कार्य हैं (गतिविधि स्टैक) तो यह काम नहीं कर रहा है। ex- मान लीजिए कि मेरे पास मेरे आवेदन A, B, C & D के लिए चार गतिविधियाँ हैं। मान लीजिए कि मेरे पास दो गतिविधि वापस ढेर हैं A-> B-> C (पृष्ठभूमि) और D-> A-> B (फोरग्राउंड) और यदि मैं मेरे वर्तमान स्टैक से कॉल गतिविधि A (D-> A-> B) आशय फ़िल्टर के साथ जो आपने सुझाव दिया कि यह क्या होगा यह मेरे वर्तमान स्टैक को साफ़ करता है (D-> A-> B) और खुली गतिविधि A और जब मैं इसे वापस दबाता हूँ आवेदन लेकिन अगर मैं हालिया ऐप बटन दबाता हूं तो मैं अपने ऐप के दो बैक स्टैक देख सकता हूं।
राहुल पारेता

31

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

हर बार जब आप एक गतिविधि शुरू करते हैं, तो इसे इस तरह शुरू करें:

Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 0);

जब आप संपूर्ण एप्लिकेशन को बंद करना चाहते हैं, तो यह करें:

setResult(RESULT_CLOSE_ALL);
finish();

RESULT_CLOSE_ALL एक अद्वितीय पूर्णांक के साथ एक अंतिम वैश्विक चर है जो यह संकेत देता है कि आप सभी गतिविधियों को बंद करना चाहते हैं।

फिर हर गतिविधि के onActivityResult(...)कॉलबैक को परिभाषित करें ताकि जब कोई गतिविधि RESULT_CLOSE_ALL मान के साथ लौटे, तो यह भी कॉल करे finish():

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode)
    {
    case RESULT_CLOSE_ALL:
        setResult(RESULT_CLOSE_ALL);
        finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

यह एक झरना प्रभाव पैदा करेगा जो आपकी सभी गतिविधियों को बंद कर देता है।

यह हालांकि एक हैक है और startActivityForResultइस तरह से उपयोग करता है कि इसका उपयोग करने के लिए डिज़ाइन नहीं किया गया था।

शायद ऐसा करने का एक बेहतर तरीका प्रसारण रिसीवर का उपयोग करना होगा जैसा कि यहां दिखाया गया है:

लॉगआउट में, केवल एक्टिविटी लॉग खोलने से "बैक" बटन को रोकने के लिए, गतिविधि का इतिहास स्टैक साफ़ करें

इन थ्रेड्स को अन्य तरीकों के लिए भी देखें:

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

सभी पिछली गतिविधियों को समाप्त करें


4
क्या यह संभव है जब आपके पास इतिहास पर लगभग 30 गतिविधियां हों ??
राकेश गोदौलिया

4
होना चाहिए। लेकिन अगर आपके पास इतिहास में 30 गतिविधियां हैं, तो आप अपने डिजाइन को बदलने पर विचार करना चाह सकते हैं। 30 थोड़ा बहुत लगता है और Android उन्हें खुद को मार सकता है।
अनूप गायकुर

1
यह करने का एक घटिया तरीका लगता है। @ राकेश गोदौलिया का उत्तर प्रश्न वैध लगता है। 30 शायद गतिविधियों की 'उच्च' संख्या का प्रतिनिधित्व करने वाली एक संख्या है। यह उत्तर बेहतर दिखता है: stackoverflow.com/a/3008684/243709
अमन आलम

यह उत्तर बहुत अच्छा है। बैकस्टैक में अपनी गतिविधियों को घटनाओं को भेजने के लिए आप EventBus लाइब्रेरी का उपयोग भी कर सकते हैं। github.com/greenrobot/EventBus
स्टेन

इरादे के साथ सरल 'Intent.FLAG_ACTIVITY_CLEAR_TOP' ध्वज का उपयोग करने के लिए बेहतर है
नवीन राव

18

गतिविधि स्टैक को पूरी तरह से खाली करने के लिए, उदाहरण के लिए, आप टास्कस्टैकबर्ल का उपयोग करके एक नया कार्य स्टैक बनाना चाहते हैं:

Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();

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


1
यह इसे करने का सबसे अच्छा तरीका है।
पॉल बर्क

FLAG_ACTIVITY_NEW_TASKया finishAffinity()मेरे लिए काम नहीं किया। केवल इस उत्तर ने उद्देश्य को हल किया।
टीएम

यदि मैं ऐप को बैक बटन के माध्यम से छोड़ता हूं और ऐप आइकन के माध्यम से वापस लौटता हूं तो यह उस गतिविधि को खोलता है जिसे मैंने विधि कहा है। इसलिए मेरे लिए काम नहीं कर रहा है।
Tgo1014

17

finishAffinity()एपीआई 16 में जोड़ा गया ActivityCompat.finishAffinity()। पिछले संस्करणों में उपयोग करें । जब आप इरादे का उपयोग करके किसी भी गतिविधि को लॉन्च करेंगे और वर्तमान गतिविधि को समाप्त करेंगे। अब ActivityCompat.finishAffinity()इसके बजाय उपयोग करें finish()। यह मौजूदा गतिविधि के नीचे सभी स्टैक्ड गतिविधि को पूरा करेगा। यह मेरे लिए ठीक काम करता है।


3
यह वास्तव में हैActivityCompat.finishAffinity()
द बर्गा

finishAffinity()एक ही आत्मीयता के पीछे ढेर में मौजूद सभी गतिविधियों के साथ वर्तमान गतिविधि को भी पूरा करता है।
नीरज सेवाणी

10

मेरे लिए क्या काम किया

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

5

एक संभावित समाधान जो मैं आपको सुझाव दे सकता हूं वह है android:launchMode="singleTop"मेरी प्रोफ़ाइलएक्टिविटी के लिए प्रकट होना । और जब लॉग आउट क्लिक किया जाता है यू कर सकते हैं logoff फिर आप शुरू करने LoginActivity। लॉगआउट यू पर इसे कॉल कर सकते हैं।

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();

मैंने ऐसा किया, जो हुआ वह है: जब मैं बैक बटन पर क्लिक करता हूं तो यह मुझे एक्टिविटी में ले जाता है, जहां से मैं प्रोफाइल
एक्टिविटी में

ऐसा इसलिए हो सकता है क्योंकि u एक नई मंशा से कॉल खत्म () नहीं करके प्रोफ़ाइलएक्टिविटी में आया था; कैसे अपने लॉगिन एक्टिविटी के अलावा अन्य गतिविधि से ProfileActivity के लिए आ रहे हैं?
एंड्रॉइड

मैं उसी प्रश्न को पार कर रहा हूं। मुझे लगता है कि यह काम नहीं करेगा जब सिस्टम द्वारा लॉगिन आशय को नष्ट कर दिया गया था, कहें कि मेमोरॉय की कमी के कारण।
user1914692

5

एपीआई 11+ के लिए आप Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASKइस तरह का उपयोग कर सकते हैं :

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

यह सभी पिछली गतिविधि को पूरी तरह से साफ़ कर देगा और नई गतिविधि शुरू करेगा।


4

आप कोशिश कर सकते हैं finishAffinity(), यह एंड्रॉइड 4.1 के ऊपर और ऊपर सभी वर्तमान गतिविधियों और कार्यों को बंद कर देता है


1
finishAffinity () एपीआई 16 में जोड़ा गया। पिछले संस्करण में ActivityCompat.finishAffinity () का उपयोग करें। मेरे लिए ठीक काम करता है।
अनुराग श्रीवास्तव

2

मैं भी इसी मुद्दे का सामना कर रहा हूँ।

लॉगिन गतिविधि में मैं क्या कर रहा हूँ।

    Intent myIntent = new Intent(MainActivity.this, ActivityLoggedIn.class);
    finish();
    MainActivity.this.startActivity(myIntent);  

लॉगआउट पर

   Intent myIntent = new Intent(ActivityLoggedIn.this, MainActivity.class);
   finish();
   ActivityLoggedIn.this.startActivity(myIntent);

यह अच्छी तरह से काम करता है, लेकिन जब मैं एक्टिविटीगॉग्डइन में होता हूं और मैं ऐप को छोटा करता हूं और ऐप ड्रॉअर पर लॉन्चर बटन आइकन पर क्लिक करता हूं, तो MainActivity फिर से शुरू होती है: - / / मैं झंडे का उपयोग कर रहा हूं

android:LaunchMode:singleTask 

MainActivity के लिए।


2

के लिए निम्नलिखित का उपयोग करें activity

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

टुकड़ा उपयोग के लिए CLEAR_TASK ध्वज निकालें ।

मुझे उम्मीद है कि यह कुछ लोगों के लिए उपयोग हो सकता है।


1

बस रखना

Intent intent = new Intent(ProfileActivity.this,
    LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

4
यह काम नहीं कर रहा है। मैं अभी भी बैक बटन का उपयोग करके प्रोफाइलएक्टिविटी में जा सकता हूं
आर्ची.bpgc

1

इरादे के किसी भी झंडे ने मेरे लिए काम नहीं किया, लेकिन मैंने इसे कैसे तय किया:

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


1

यह कोशिश करो यह काम करेगा:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();

1

एपीआई स्तर 11 या अधिक में, सभी गतिविधि स्टैक को खाली करने के लिए इरादे पर उपयोग करें FLAG_ACTIVITY_CLEAR_TASKऔर FLAG_ACTIVITY_NEW_TASKध्वजांकित करें ।

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |  Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

0

इसे इस्तेमाल करो

Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();

क्या आप सेटफ्लैग और ऐडफ्लैग जानते हैं?
GvSharma


0

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

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

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.