Android: स्टैक में सहेजे बिना खुली गतिविधि


94

मेरी 2 गतिविधियाँ हैं: मुख्य और सूची।

मुख्य से आप सूची खोल सकते हैं; सूची से आप मुख्य खोल सकते हैं।

मुझे यह पसंद है ताकि सूची के प्रत्येक उद्घाटन को 'इतिहास' में सहेजा जाए। इसलिए, मुख्य से वापस दबाने पर सूची में वापस नहीं जा सकते

क्या यह संभव है?


11
यदि 'सूची' मुख्य 'शुरू होती है' तो इसके finish()तुरंत बाद कॉल करें startActivity(...)। इस तरह से यदि उपयोगकर्ता BACK को 'मुख्य' से दबाता है तो वापस जाने के लिए कुछ भी नहीं होगा।
स्क्वॉन्क

यह अधिसूचना नेविगेशन के लिए है लेकिन अवधारणाएं डेवलपर पर
केविन ली

जवाबों:


159

अपनी सूची शुरू करते समय Activity, उसके Intentझंडे सेट करें जैसे:

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

FLAG_ACTIVITY_NO_HISTORYझंडा नई रहता Activityइतिहास ढेर में शामिल होने से।

NB: जैसा @ @ बताते हैं, आप i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);इसके बजाय उपयोग कर सकते हैं । कोई कार्यात्मक अंतर नहीं है।


2
इस विधि पर बस थोड़ी सी टिप्पणी: यह एक पूरी तरह से काम करेगा यदि केवल 2 गतिविधि हो। लेकिन अगर सूची गतिविधि एक और गतिविधि शुरू करने में सक्षम है (तीसरी गतिविधि कहने दें), तीसरी गतिविधि में बैक बटन के लिए एक प्रेस मुख्य गतिविधि पर लौटेगा और सूची गतिविधि नहीं
विंसएफआर

वास्तव में। दुर्भाग्य से, इससे बचने का कोई उपाय नहीं है। कोई Intentध्वज नहीं है जो बताता है कि "केवल Activityमूल में नहीं लौटने पर इतिहास में जोड़ता है "।
एरिक

1
नहीं, लेकिन FLAG_ACTIVITY_NEW_TASK ध्वज कार्य करेगा, सूची गतिविधि को इतिहास में जोड़ा जाएगा, लेकिन हमेशा सबसे ऊपर, इसलिए मुख्य गतिविधि से एक बैक प्रेस सूची गतिविधि को प्रदर्शित नहीं करेगा
VinceFR

7
क्या कोई विशेष कारण है setFlags()जिसके getFlags()बजाय आपने इसका उपयोग किया है Intent.addFlags()?
सैम

1
@VinceFR यह वही है जो मैं चाहता हूँ! a -> b -> c और वापस c-
realtebo

89

मैनिफ़ेस्ट फ़ाइल ऐड में:

android:noHistory="true" 

ऐसी गतिविधि जो आप स्टैक पर नहीं रखना चाहते हैं।


क्या झंडा no_history के साथ गतिविधि शुरू करने से कोई अंतर है?
realtebo

1
जैसे आपने अपने प्रश्न में कहा था "सूची के प्रत्येक उद्घाटन को 'इतिहास' में सहेजा नहीं जा सकता है" इसलिए जब भी आप अपना आवेदन फिर से खोलेंगे तो आपको मुख्य गतिविधि में लाया जाएगा
Marcin S.

@MarcinS। जब ऐप हाल की ऐप सूची में नहीं है तो यह काम नहीं कर रहा है। क्या आप कृपया इसके बारे में बता सकते हैं कि ऐसा क्यों हो रहा है
अजीत कुमार दुबे

1
तो उन 2 दृष्टिकोणों (प्रकट और ध्वज) में क्या अंतर है?
पोमबोशा

@pumbosha घोषणापत्र दृष्टिकोण हमेशा गतिविधि को इतिहास से बाहर कर देगा। ध्वज दृष्टिकोण आपको रनटाइम पर उस व्यवहार को नियंत्रित करने देता है।
जॉन क्रॉफोर्ड

27

क्लियरिंग के साथ नए कार्य का उपयोग करें। यह मेरे मामले में काम किया जब अन्य विकल्प नहीं थे।

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

संपूर्ण इतिहास स्टैक को साफ़ करें और Android पर एक नई गतिविधि शुरू करें


1
यह बहुत अच्छा होगा, लेकिन क्या सिस्टम के व्यापक "बदलते कार्य" एनीमेशन को रोकने का एक तरीका है? FLAG_ACTIVITY_NO_ANIMATION जोड़ने से दुर्भाग्य से इसे रोका नहीं जा सकता है!
androidguy

यह अनुप्रयोग की गति पर प्रभाव डालता है?
एकौआ पिटा

23

ऐसा लगता है, यदि आप अपनी गतिविधि पर कॉल फ़िनिश () सही करने के बाद दूसरे को खोलते हैं, तो जो समाप्त होता है उसे स्टैक से हटा दिया जाता है।

उदाहरण के लिए:

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

यदि आपका फोन इतना तेज नहीं है तो आप देखेंगे कि पिछली गतिविधि बंद हो रही है।
नोलन

@ नोलन तभी है जब आप गतिविधि शुरू करने से पहले समाप्त करते हैं
हेनरिक बोगेलुंड लवस्टेंस

7

मेरे विशेष मामले में FLAG_ACTIVITY_NO_HISTORYकाम नहीं किया। न तो किया था FLAG_ACTIVITY_NEW_TASKया FLAG_ACTIVITY_CLEAR_TASKअकेले खुद को काम से।

हालाँकि FLAG_ACTIVITY_NEW_TASKऔर FLAG_ACTIVITY_CLEAR_TASKसाथ में काम किया।

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

3

बस कोटलिन में ऐसा करने का एक तरीका जोड़ना चाहता था:

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))

2
Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
कोटलिन

3

उत्तर देर से, लेकिन अन्य उत्तरों में कुछ गहराई जोड़ता है। यह सब नीचे आता है कि आप उस गतिविधि से शुरू हुई अन्य गतिविधियों के साथ क्या करना चाहते हैं

विकल्प 1 - बस इस एक गतिविधि में कॉलिंग गतिविधि का इतिहास नहीं होना चाहिए

तो बस करो:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

विकल्प 2 - उस विशिष्ट गतिविधि से शुरू होने वाली सभी गतिविधियों का इतिहास नहीं होना चाहिए

फिर कॉलिंग गतिविधि के प्रकटन में जोड़ें:

android:noHistory="true" 

लेकिन अगर आप नई गतिविधि में इतिहास रखना चाहते हैं, तो आपको मैन्युअल रूप से ध्वज को हटाना होगा:

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

आशा है कि अन्य उत्तरों को स्पष्ट करता है :)


2

यदि गतिविधि पहले से चल रही है, तो FLAG_ACTIVITY_CLEAR_TOP आज़माएँ:

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


-4

क्या आप 'रिटर्न' की कार्यक्षमता को रोकने के लिए विशेष गतिविधि पर बैक बटन को ओवरराइड नहीं कर सकते हैं?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;
    }
    return super.onKeyDown(keyCode, event);
}

6
यह मत करो। विशिष्ट उद्देश्यों के लिए BACK को रोकना स्वीकार्य है लेकिन विशुद्ध रूप से BACK प्रेस का उपभोग करने के लिए करना और एक Activityअच्छा व्यवहार नहीं है।
स्क्वॉन्क

1
पूरी तरह से सहमत ^ केवल एक विकल्प।
ब्रुक

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