2010-11-16 15 views
52

मेरे पास एंड्रॉइड में कई गतिविधियां हैं और मैं चाहता हूं कि उपयोगकर्ता मेनू बटन दबाकर लॉग-आउट करने में सक्षम हो। समस्या मेरे पास हैगतिविधियों के एंड्रॉइड स्टैक को कैसे साफ़ करें?

ए) एंड्रॉयड आप आवेदन और
बी) समाप्त कर देते हैं जब मैं LoginActivity को भेज देते फिर वे हमेशा वापस दबाएँ और सही पिछले करने के लिए वापस प्राप्त कर सकते हैं यह नहीं है कि है गतिविधि वे थे

में मैं पहले से ही दो निम्नलिखित झंडे के साथ गतिविधि शुरू करने के लिए करने की कोशिश की:।

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

मैं भी खुद से उनमें से हर एक के साथ की कोशिश की।

मैंने finish() को startActivity(intent) के बाद कॉल करने का भी प्रयास किया क्योंकि मैंने एक और स्टैक ओवरफ्लो प्रश्न में पढ़ा था।

+0

आपको अपनी गतिविधि को अपने मैनिफेस्ट में सिंगलइंस्टेंस के रूप में घोषित करना होगा। – Falmarri

+0

[एंड्रॉइड: बैक स्टैक साफ़ करें] के समान] (http://stackoverflow.com/questions/5794506/android-clear-the-back-stack) –

उत्तर

35

अपना लॉगिन गतिविधि में, वापस बटन को ओवरराइड, तो यह गतिविधि को पूरा किये बगैर अपने अनुप्रयोग के बजाय छुपाता है: alwaysRetainTaskState = "true" जड़ गतिविधि पर है, तो:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     moveTaskToBack(true); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

इसके अलावा एंड्रॉयड स्थापित करने के लिए सुनिश्चित हो एंड्रॉइड उपयोगकर्ता से निष्क्रियता की 30min के बाद आपके ढेर (लॉगिन गतिविधि सहित) को साफ़ नहीं करता है।

फिर सफल लॉगिन होने पर बस फिनिश() को कॉल करें।

+8

धन्यवाद, आपका कोड मुझे सही रास्ते में मिला है, लेकिन यह करेगा वही: @ ओवरराइड सार्वजनिक शून्य पर बैकप्रेस() { moveTaskToBack (सत्य); } – Totic

+0

ठीक है, इसलिए मेरे पास उपयोगकर्ता लगातार गतिविधियों के बीच स्विच कर रहा है, जिसका अर्थ है कि उन्होंने 20 सेकंड में 15 गतिविधियों को स्विच किया होगा। क्या यह स्मृति त्रुटि से बाहर हो सकता है? इसे ठीक करने के लिए मुझे क्या करना चाहिए? धन्यवाद! –

3

Intent.FLAG_ACTIVITY_CLEAR_TOP सेट करना मेरे लिए एक बहुत ही समान मामले में काम करता है, जहां मैंने Intent.FLAG_ACTIVITY_NEW_TASK ध्वज सेट नहीं किया था। क्या आपने बिना कोशिश की है?

42

यह थोड़ा सा होना चाहिए या आपने पहले के ध्वज को ओवरराइट करना समाप्त कर दिया है।

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

तो जैसा:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
+0

मैंने इसे कई बार आजमाया है लेकिन आवश्यक परिणाम नहीं मिला है। कृपया मेरी मदद करें – amity

+30

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

+0

यह एपीआई स्तर के साथ काम नहीं करेगा <11. एपीआई स्तर के साथ अनुपालन समाधान के लिए मेरा [उत्तर] (http://stackoverflow.com/a/24352988/636561) देखें = = –

6

आप Android API 11 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो आप ढेर स्पष्ट करने के लिए निम्नलिखित कोड का उपयोग कर सकते हैं।

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
+0

ठीक है, इसलिए मेरे पास उपयोगकर्ता लगातार गतिविधियों के बीच स्विच कर रहा है, जिसका अर्थ है कि उन्होंने 20 सेकंड में 15 गतिविधियों को स्विच किया होगा। क्या यह स्मृति त्रुटि से बाहर हो सकता है? इसे ठीक करने के लिए मुझे क्या करना चाहिए? धन्यवाद! –

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

लिखने इस और ध्यान दें: LoginActivity लांचर के रूप में पहले शुरू किया जाना चाहिए

यदि आप लिखना किसी भी लांचर मोड झंडे अपने उद्देश्य ओवरराइट कर रहे हैं, तो launchermode को हटा दें और आप निश्चित रूप से मिल जाएगा की कोशिश यह

31

WakkaRemoving an activity from the history stack में ...


अपने <activity> में जोड़े android:noHistory="true" विशेषता AndroidManifest.xml इस तरह में:

<activity android:name=".MyActivity" 
    android:noHistory="true"> 
</activity> 
+1

+1। वास्तव में मैं क्या चाहता था .. !! :) –

+2

बिल्कुल सही! यह सरल है –

+0

बिल्कुल सही धन्यवाद –

2

मेरे लिए यह काम :)

Intent main = new Intent(this, A_Activity.class); 
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
    | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(main); 

Intent tool = new Intent(this, B_Activity.class); 
startActivity(tool); 
finish(); 

कहाँ एक उदाहरण के लिए मेरी जड़ गतिविधि है

मेरे पास गतिविधियां हैं ए -> बी -> सी -> डी जब मैं sta को कॉल करता हूं आरटी गतिविधि ई स्टैक पर अब मेरे पास है -> ई

मुझे नहीं पता यह अच्छा है :) लेकिन काम करता है।

+0

ठीक है, इसलिए मेरे पास उपयोगकर्ता लगातार गतिविधियों के बीच स्विच कर रहा है, जिसका अर्थ है कि उन्होंने 20 सेकंड में 15 गतिविधियों को स्विच किया होगा। क्या यह स्मृति त्रुटि से बाहर हो सकता है? इसे ठीक करने के लिए मुझे क्या करना चाहिए? धन्यवाद!' –

+0

@ रुचिर बरोनिया इसे स्मृति से बाहर नहीं होना चाहिए। शायद कुछ आपको स्मृति में गतिविधियों को रख रहा है :) जांचें: http://blogs.innovationm.com/android-out-of-memory-error-causes-solution-and-best-practices/ –

5

यह आपकी गतिविधि को वापस ढेर नहीं करेगा।

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

यह मैं क्या किया है:

@Override 
public void onBackPressed() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(startMain); 
} 

अब किसी भी परेशानी के बिना वापस प्रेस :) पर मेरे ऐप बाहर निकलता है।

+0

कृपया ध्यान रखें कि बहुत कुछ उत्तर की तुलना करते समय फियोयो और कपकेक के एसडीके संस्करणों के बीच बदल गया है। दूसरे शब्दों में, जो कुछ 2010 में एक निश्चित तरीके से काम करता है वह अब अलग-अलग काम कर सकता है। – Brandon

+0

हाँ, आप सही हैं। मैं इसे ध्यान में रखूंगा। धन्यवाद। – amalBit

+0

यह कोड काम नहीं कर रहा है –

0

अगर हम प्रवेश गतिविधि (ए) शुरू करने के लिए इस कोड का उपयोग:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 

गतिविधि गतिविधियों के ढेर में होना चाहिए, अन्यथा इस झंडे कोई असर नहीं होगा।

यदि हम गतिविधि (बी) (बी से वापस जाने से बचने के लिए) लॉन्च करने के बाद लॉग इन गतिविधि (ए) में फिनिश() का उपयोग करते हैं, तो गतिविधि ए (लॉगिन) ढेर में नहीं होगा। बिल्कुल वही होता है जब लॉगिन गतिविधि में विशेषता के रूप में "noHistory" होता है।

तो, मेरे लिए समाधान अन्य प्रतिक्रियाओं का मिश्रण था:

इस कोड, गतिविधि बी में चला जाता है वापस प्रवेश गतिविधि के लिए आते हैं से बचने के लिए:

@Override 
public void onBackPressed() { 
    moveTaskToBack(true); 
    super.onBackPressed(); 
} 

और इस कोड में चला जाता है गतिविधि है जो लॉगआउट फ़ंक्शन को कॉल करें:

public static void logout() { 
    Intent intent = new Intent(activity, LoginMain.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
} 
संबंधित मुद्दे