एंड्रॉइड: स्पष्ट गतिविधि स्टैक


132

मैं अपने आवेदन में कई गतिविधियाँ कर रहा हूँ। और प्रवाह बहुत जटिल है। जब मैं लॉगआउट एप्लिकेशन को स्क्रीन पर लॉगिन करने के लिए नेविगेट करता हूं और वहां से उपयोगकर्ता रद्द बटन (कॉलिंग system.exit(0)) से बाहर निकल सकता है

जब मैं बाहर निकलता हूं या बटन दबाता हूं, तो सिस्टम स्टैक से किसी गतिविधि को आमंत्रित करता है :( लॉगिन स्क्रीन तक पहुंचने पर मैं स्टैक में सभी गतिविधियों को कैसे साफ कर सकता हूं? कॉलिंग finish()व्यावहारिक नहीं है क्योंकि बहुत सारी गतिविधियां हैं और कुछ गतिविधियों को कब बंद नहीं किया जाना चाहिए? वे सक्रिय हैं जैसे कि देशी कैमरा चालान गतिविधि।

validateuser logoutuser = new validateuser();
logoutuser.logOut();
Intent loginscreen = new Intent(homepage.this, Login2.class);
(homepage.this).finish();
loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(loginscreen);

1
इस लिंक की जाँच करें ... stackoverflow.com/questions/5139686/exit-an-android-app/…
xydev

जवाबों:


339

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

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

डॉक्टर से :

public static final int FLAG_ACTIVITY_CLEAR_TASK
एपीआई स्तर 11 में जोड़ा गया

यदि एक इरादे में पारित किया जाता है Context.startActivity(), तो यह ध्वज किसी भी मौजूदा कार्य का कारण बनेगा जो गतिविधि के साथ जुड़ा होगा जो गतिविधि शुरू होने से पहले साफ़ हो जाएगा। यही है, गतिविधि एक अन्यथा खाली कार्य की नई जड़ बन जाती है, और कोई भी पुरानी गतिविधि समाप्त हो जाती है। यह केवल के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है FLAG_ACTIVITY_NEW_TASK


पूरी तरह से काम किया। धन्यवाद। अजीब तरह से minSDK = 9 के साथ त्रुटि नहीं दी।
Mahm00d

सच कहूं तो मैंने इस कार्यक्षमता का उपयोग नहीं किया, दुर्घटना के बाद फिर से जीवित हो जाना, आदि, और उन मुद्दों को ठीक करने पर ध्यान केंद्रित किया जो दुर्घटना का कारण बने)
सिंथी बांदेरा

समान कार्यक्षमता भी IntentCompat.makeRestartActivityTaskसमर्थन पुस्तकालय से प्रदान करता है।
सील्सकेज

केवल उन दो झंडों को जोड़ने से गतिविधि स्टैक ट्रैक पीछे हो जाता है (पिछले एक के ऊपर शुरू होता है), फिर जोड़ा गया Intent.FLAG_ACTIVITY_CLEAR_TOP जो केवल एप्लिकेशन को पुनरारंभ करता है और फिर पूरी तरह से बाहर निकलता है। मैंने स्पष्ट रूप से गतिविधियों के लिए कोई ध्वज नहीं जोड़ा है। क्या समस्या हो सकती है?
फरीद

1
सबसे अच्छी शुरुआत में से एक: "आप में से अधिकांश गलत हैं।"
निबाना

31

जब आप startActivityअंतिम गतिविधि पर कॉल करते हैं तो आप हमेशा उपयोग कर सकते हैं

Intent.FLAG_ACTIVITY_CLEAR_TOP

उस इरादे पर एक झंडे के रूप में।

झंडे के बारे में यहाँ और पढ़ें ।


वह भी मदद नहीं करता है। मैं सिर्फ एक गतिविधि डाट लाता हूं जो खत्म () के साथ समाप्त नहीं होता है; :(
जय मयू

मुझे लगता है कि FLAG_ACTIVITY_CLEAR_TOP शीर्ष पर गतिविधियों को साफ़ करता है। मेरी समस्या नीचे की ओर की गतिविधियाँ है :(
Jay Mayu

मुझे लगता है कि यह इस बात पर निर्भर करता है कि प्रवाह वास्तव में कैसा है। आपको इसके बारे में यहां और अधिक पढ़ना चाहिए: developer.android.com/reference/android/content/… और developer.android.com/guide/topics/fundamentals/…
डेविड ऑल्सन

7
सही संसाधन दिखाने के लिए धन्यवाद। मैंने जो गलती की वह लॉगिन गतिविधि को बंद कर रहा था। मुझे इसे बंद नहीं करना चाहिए। जब गतिविधि पहले भरी। इसलिए जब मैं Clear_top ध्वज का उपयोग करके इसे वापस बुलाता हूं, तो लॉगिन गतिविधि शीर्ष पर सभी गतिविधियों को साफ़ करती है। चूंकि लॉगिन पहली एंट्रेस एक्टिविटी है, इसलिए इसके बाद शुरू हुई सभी एक्टिविटीज को क्लियर करता है। तो बिंगो ने काम किया :)
Jay Mayu

13
प्रलेखन से, FLAG_ACTIVITY_CLEAR_TOP स्टैक को केवल तभी साफ़ करता है जब विशिष्ट गतिविधि "पहले से ही चालू कार्य में चल रही हो"
AlikElzin-kilaka

16

यहां नई शीर्ष गतिविधि के रूप में एक नई गतिविधि शुरू करने के लिए एक सरल सहायक विधि है जो वर्तमान संस्करण 17 तक एपीआई स्तर 4 से काम करता है:

static void startNewMainActivity(Activity currentActivity, Class<? extends Activity> newTopActivityClass) {
    Intent intent = new Intent(currentActivity, newTopActivityClass);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11
    currentActivity.startActivity(intent);
}

इसे अपनी वर्तमान गतिविधि से इस तरह से कॉल करें:

startNewMainActivity(this, MainActivity.class);

1
क्या आप हमेशा सिर्फ इरादे का उपयोग नहीं कर सकते थे ।addFlags (0x8000); और सरल है कि?
डावोर

जैसा कि इस ध्वज को सबसे पहले हनीकॉम्ब में पेश किया गया था, मुझे नहीं पता कि इसके पहले संस्करणों पर इसका क्या निहितार्थ हो सकता है। तो, यह मेरे लिए किया जा रहा है preaucios था। लेकिन मुझे लगता है कि संघनित्र को हटाने से समस्या नहीं होनी चाहिए।
6'13

1
जब आप एपीआई स्तर <11 चाहते हैं तो आप उस झंडे को जोड़ना चाहते हैं, तो आपको कभी Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMBऔर intent.addFlags(0x8000);नहीं जोड़ना होगा
स्ट्रॉ हैट

मैं इंटेंट्स के माध्यम से उपयोगकर्ता को एक के बाद एक कई गतिविधियों से गुजर रहा हूँ। क्या मुझे यह सुनिश्चित करने के लिए कुछ करने की ज़रूरत है कि ऐप ढेर पर बहुत सारी गतिविधियों के साथ दुर्घटनाग्रस्त न हो? धन्यवाद!
रुचिर बैरनिया

9

नीचे दिए गए कोड के द्वारा स्पष्ट गतिविधि बैकस्टेट :

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

किया हुआ


मैं इंटेंट्स के माध्यम से उपयोगकर्ता को एक के बाद एक कई गतिविधियों से गुजर रहा हूँ। क्या मुझे यह सुनिश्चित करने के लिए कुछ करने की ज़रूरत है कि ऐप ढेर पर बहुत सारी गतिविधियों के साथ दुर्घटनाग्रस्त न हो? धन्यवाद!
रुचिर बैरनिया

@ रुचिरबार्निया, यदि आप A -> B -> C -> D -> E -> F -> G -> H, अब H -> आप अपना कोड लिखते हैं तो मैं लास्ट एक्टीविटी करूंगा उसके बाद आप बैक बटन दबाएं। ऐप बंद हो जाएगा क्योंकि ऐप में कोई बैकस्ट गतिविधि नहीं है, आशा है कि यह आपकी मदद करेगा।
हिरेन पटेल

क्या मुझे ऐसा करने की आवश्यकता है? यदि मैं कभी भी गतिविधि स्टैक को साफ नहीं करता तो क्या होगा?
रुचिर बरोनिया

@ रुचिरबनिया, बैकप्रेस: ​​एच -> जी -> एफ -> ई -> डी -> सी -> बी -> ए
हिरेन पटेल

लेकिन कुछ समय यह नई गतिविधि को कॉल करते समय सफेद स्क्रीन दिखाता है। इसे हल करने के लिए हो?
सागर

4

मेरे मामले में, LoginActivity को भी बंद कर दिया गया था। नतीजतन,

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK

कोई सहायता नहीं की।

हालाँकि, सेटिंग

Intent.FLAG_ACTIVITY_NEW_TASK

मेरी मदद की।


मैं इंटेंट्स के माध्यम से उपयोगकर्ता को एक के बाद एक कई गतिविधियों से गुजर रहा हूँ। क्या मुझे यह सुनिश्चित करने के लिए कुछ करने की ज़रूरत है कि ऐप ढेर पर बहुत सारी गतिविधियों के साथ दुर्घटनाग्रस्त न हो? धन्यवाद!
रुचिर बरोनिया

3
Intent intent = new Intent(LoginActivity.this, Home.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //It is use to finish current activity
startActivity(intent);
this.finish();

1
तुम दोनों क्यों प्रयोग कर रहे हैं this.finish()और setFlags()यह भी वर्तमान गतिविधि स्पष्ट करने के लिए?
सागर

3

मैंने नोट किया कि आपने एक समाधान के लिए कहा था जिस पर भरोसा नहीं किया जाता है finish() , लेकिन मुझे आश्चर्य है कि क्या यह फिर भी मदद कर सकता है।

मैंने ट्रैक किया कि क्या एक्ज़िट फ़्लैग को स्टैटिक क्लास वैरिएबल के साथ उठाया जाता है, जो पूरे ऐप की उम्र तक जीवित रहता है। प्रत्येक प्रासंगिक गतिविधि में onResume(), का उपयोग करें

@Override
public void onResume() {
    super.onResume();
    if (ExitHelper.isExitFlagRaised) {
        this.finish();
    }
}

एक्सिटहेल्पर क्लास

public class ExitHelper {
    public static boolean isExitFlagRaised = false;
}

मान लीजिए कि मुख्यता में, एक उपयोगकर्ता बाहर निकलने के लिए एक बटन दबाता है - आप सेट कर सकते हैं ExitHelper.isExitFlagRaised = true;और फिर finish()। इसके बाद, अन्य प्रासंगिक गतिविधियाँ जो अपने आप फिर से शुरू हो जाती हैं, उन्हें भी समाप्त कर दिया जाएगा।


क्या होगा यदि मैं MainActivity onresume () में कोड का उपयोग करता हूं, तो 2 गतिविधि onbackpress से मुख्यता पर वापस आता हूं
Mithu

3

यह निर्णय ठीक काम करता है:

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

लेकिन नई गतिविधि लंबे समय तक लॉन्च होती है और आप कुछ समय बाद सफेद स्क्रीन देखते हैं। यदि यह महत्वपूर्ण है तो इस समाधान का उपयोग करें:

public class BaseActivity extends AppCompatActivity {

    private static final String ACTION_FINISH = "action_finish";

    private BroadcastReceiver finisBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        registerReceiver(finisBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                finish();
            }
        }, new IntentFilter(ACTION_FINISH));
    }

    public void clearBackStack() {
        sendBroadcast(new Intent(ACTION_FINISH));
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(finisBroadcastReceiver);
        super.onDestroy();
    }
}

इसका उपयोग कैसे करें:

public class ActivityA extends BaseActivity {

    // Click any button
    public void startActivityB() {
        startActivity(new Intent(this, ActivityB.class));
        clearBackStack();
    }
}

नुकसान: सभी गतिविधियाँ जो स्टैक पर बंद होनी चाहिए, वे बेसएक्टिविटी को बढ़ाती हैं


2

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

intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);

1

कोटलिन का उपयोग करना:

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