गतिविधि स्टैक को खाली करने के लिए आप Intent.FLAG_ACTIVITY_CLEAR_TOP का उपयोग कैसे करते हैं?


84

मैंने इसे उपयोग करने के बारे में कई पोस्टों के माध्यम से पढ़ा है, लेकिन कुछ गायब होना चाहिए क्योंकि यह मेरे लिए काम नहीं कर रहा है। मेरी गतिविधि A के प्रमोचन में घोषणापत्र = "singleTop" है। यह लॉन्चमोड = "सिंगलइनस्टेंस" के साथ गतिविधि बी शुरू करता है। एक्टिविटी बी एक ब्राउज़र खोलता है और प्राप्त करता है और वापस आ जाता है, यही कारण है कि यह सिंगलइंस्टेंस है। मैं बैक बटन को ओवरराइड करने की कोशिश कर रहा हूं ताकि उपयोगकर्ता को गतिविधि ए में वापस भेजा जाए, और फिर वापस गतिविधि बी को वापस करने के बजाय, गतिविधि को छोड़ने के लिए वापस दबाएं।

// activity B
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
  && keyCode == KeyEvent.KEYCODE_BACK
  && event.getRepeatCount() == 0) onBackPressed();
 return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
 startActivity(new Intent(this, UI.class)
 .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
 return;
}

ब्राउज़र से लौटने के बाद, स्टैक है ... ए, बी, ब्राउज़र, बी

मुझे उम्मीद है कि इस कोड को स्टैक को ... ए ... में बदल दिया जाएगा ताकि उपयोगकर्ता एक बार फिर से दबाने पर होम स्क्रीन पर वापस आ सके।

इसके बजाय यह स्टैक को बदलने लगता है ... ए, बी, ब्राउज़र, बी, ए ... जैसे कि उन झंडे नहीं हैं।

मैंने शुरुआत के बाद गतिविधि बी में कॉलिंग फिनिश () की कोशिश की, लेकिन फिर बैक बटन मुझे फिर से ब्राउज़र में वापस ले जाता है!

मैं क्या खो रहा हूँ? धन्यवाद!

जवाबों:


72

@bitestar के पास सही समाधान है, लेकिन एक और कदम है:

यह डॉक्स में छिपा हुआ था, हालाँकि आपको इसके अलावा किसी भी चीज़ launchModeका परिवर्तन करना होगा । अन्यथा शीर्ष पर रीसेट होने के बजाय इसे नष्ट कर दिया जाएगा और फिर से बनाया जाएगा।Activitystandard


51
वास्तव में ... Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPबस यही करेंगे।
डर्क-जन

इसके उदाहरण के लिए Steel_fedex के समाधान की जाँच करें।
दरपन

2
तो जहां नरक Steel_fedex का समाधान है ?!
चांगवॉन जियोंग जुइसिकुल

112

मैंने गतिविधि A-> B-> C-> D शुरू किया है। जब गतिविधि पर बैक बटन दबाया जाता है तो DI गतिविधि ए पर जाना चाहता है क्योंकि A मेरा शुरुआती बिंदु है और इसलिए पहले से ही स्टैक पर A के शीर्ष की सभी गतिविधियाँ साफ़ हो जाती हैं और आप A से किसी अन्य गतिविधि पर वापस नहीं जा सकते हैं ।

यह वास्तव में मेरे कोड में काम करता है:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Intent a = new Intent(this,A.class);
        a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(a);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}       

4
यह समाधान सभी मध्यस्थ गतिविधियों को बंद कर रहा है; लेकिन यह भी, RootActivity को पुनरारंभ करना। आप नीचे @ Steel_Fedex का समाधान देख सकते हैं। यह वही करता है, लेकिन रूटएक्टिविटी को फिर से शुरू नहीं करता है।
डेरापॉन

यह मेरे मामले का सबसे अच्छा समाधान है। मैं वास्तव में फिर से शुरू करने के लिए रूट गतिविधि चाहता हूं
ताश पेमहिवा

24

इसके लिए, मैं FLAG_ACTIVITY_CLEAR_TOPशुरू करने के लिए Intent
(बिना FLAG_ACTIVITY_NEW_TASK) ध्वज का उपयोग करता हूं

और launchMode = "singleTask"लॉन्च की गई गतिविधि के लिए।

लगता है जैसे यह काम करता है जैसा कि मुझे चाहिए - गतिविधि फिर से शुरू नहीं होती है और अन्य सभी गतिविधियां बंद हो जाती हैं।


मैंने जाँच की, Bitster का समाधान काम नहीं करता है। जबकि इस समाधान ने काम किया। रूटएक्टिविटी फिर से शुरू नहीं हुई।
डेरापॉन

अपने शब्दों को अधिक समझदारी से चुनें। बिटस्टार समाधान वास्तव में काम करता है!
जेस्पर बिस्कोफ-जेनसेन

सिंगलटैस्क मेरे लिए काम करता है, इसलिए एक्टिविटी दोबारा नहीं बनाएगी, और ऑन इवेंट को हैंडल नहीं करेगी।
जिशी चेन

11

हालाँकि इस प्रश्न के पास पहले से ही पर्याप्त उत्तर हैं, मैंने सोचा कि कोई जानना चाहता है कि यह ध्वज इस अजीब तरीके से क्यों काम करता है, यह वही है जो मुझे Android प्रलेखन में मिला था

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

यदि उसने अपने लॉन्च मोड को "मल्टीपल" (डिफ़ॉल्ट) घोषित किया है और आपने FLAG_ACTIVITY_SINGLE_TOP को एक ही इरादे से सेट नहीं किया है, तो यह समाप्त हो जाएगा और फिर से बनाया जाएगा; अन्य सभी लॉन्च मोड के लिए या यदि FLAG_ACTIVITY_SINGLE_TOP सेट है तो यह आशय वर्तमान उदाहरण के onNewIntent () पर दिया जाएगा।


तो, या तो,
1launchModeगतिविधि ए को मानक से कुछ और (यानी singleTaskया कुछ और) में बदलें । तब आपका ध्वज FLAG_ACTIVITY_CLEAR_TOPआपकी गतिविधि A को पुनरारंभ नहीं करेगा।

या,

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPअपने ध्वज के रूप में उपयोग करें । फिर यह आपकी इच्छानुसार काम करेगा।


8

मैं समस्या को हल करने के लिए तीन झंडे का उपयोग करता हूं:

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

4

Android जोड़ें: noHistory = प्रकट फ़ाइल में "सही"।

<manifest >
        <activity
            android:name="UI"
            android:noHistory="true"/>

</manifest>

पहली बार इस झंडे को देखें, लेकिन इसने मेरे मामले के लिए काम किया, धन्यवाद
vlasentiy

3

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

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

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


2

मुझे पता है कि पहले से ही एक स्वीकृत उत्तर है, लेकिन मैं यह नहीं देखता कि यह ओपी के लिए कैसे काम करता है क्योंकि मुझे नहीं लगता कि FLAG_ACTIVITY_CLEAR_TOP उसके विशेष मामले में सार्थक है। यह ध्वज केवल उसी कार्य में गतिविधियों के साथ प्रासंगिक है । उनके विवरण के आधार पर, प्रत्येक गतिविधि अपने स्वयं के कार्य में है : ए, बी, और ब्राउज़र।

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

"यदि वर्तमान कार्य के शीर्ष पर गतिविधि का एक उदाहरण पहले से मौजूद है , तो सिस्टम उस उदाहरण के इरादे को बताता है ..."

चूँकि B A शुरू करता है, इसलिए वर्तमान कार्य B का कार्य है, जोकि एक एकलता के लिए है और इसलिए इसमें वांछित परिणाम प्राप्त करने के लिए A.TT का उपयोग नहीं कर सकता क्योंकि तब सिस्टम उस कार्य को खोज लेगा जो A के पास है और उस कार्य को अग्रभूमि में लाता है।

अंत में, बी के बाद ए शुरू हो गया है, और उपयोगकर्ता ए से वापस दबाता है, ओपी या तो बी या ब्राउज़र नहीं देखना चाहता है। इसे प्राप्त करने के लिए, बी में कॉलिंग फिनिश () सही है; फिर, FLAG_ACTIVITY_CLEAR_TOP A के कार्य में अन्य गतिविधियों को नहीं हटाएगा क्योंकि उसकी अन्य गतिविधियाँ सभी विभिन्न कार्यों में हैं। वह टुकड़ा जो गायब था, हालांकि यह है कि B को ब्राउज़र के इरादे से फायरिंग करते समय FLAG_ACTIVITY_NO_HISTORY का भी उपयोग करना चाहिए। ध्यान दें: यदि ब्राउज़र पहले से ही ओपी के आवेदन को शुरू करने से पहले ही चल रहा है, तो निश्चित रूप से आप ए से वापस दबाते समय ब्राउज़र को देखेंगे। इसलिए वास्तव में यह परीक्षण करने के लिए, आवेदन शुरू करने से पहले ब्राउज़र से बाहर वापस जाना सुनिश्चित करें।


1

FLAG_ACTIVITY_NEW_TASK यहां वह समस्या है जो एक नया कार्य आरंभ करती है। बस इसे हटा दें और आप संपन्न हो गए हैं।

वैसे मैं आपको यह पढ़ने की सलाह देता हूं कि उनके साथ काम करने से पहले हर झंडा क्या करता है

इस और आशय के झंडे यहां पढ़ें


1
मैंने ध्वज को पढ़ा, और यह मेरी तरह लग रहा था कि मुझे क्या चाहिए। इसके बावजूद, FLAG_ACTIVITY_NEW_TASK को हटाने से परिणाम पर कोई प्रभाव नहीं पड़ता है। यह अभी भी एक अंतहीन बैक बटन लूप है ... A-> B, A से वापस, B से वापस, A से वापस ...
piusvelte

क्या आप सुनिश्चित हैं कि आप B को सिंगल इनस्टेंस के रूप में क्यों उपयोग कर रहे हैं? AA "singleInstance" एक्टिविटी जैसे कि FLAG_ACTIVITY_NEW_TASK इरादे में थी। डेवलपर डेवलपर
.android.com

B को ब्राउज़र से वापस आशय प्राप्त करने की आवश्यकता है। मैंने लॉन्चटोड को सिंगलटैस्क में बदलने की कोशिश की, और यह अभी भी काम करता है, लेकिन बैक बटन लूपिंग अभी भी होता है।
piusvelte

मुझे लगता है कि यह काम नहीं किया क्योंकि आपने FLAG_ACTIVITY_NEW_TASK का उपयोग किया था। वहां केवल FLAG_ACTIVITY_CLEAR_TOP का उपयोग करें और न ही सिंगलटैस्क और न ही एकल उपयोग से बचें
100rabh

1
मुझे लगता है कि एक कामकाजी समाधान होना चाहिए, अगर आप Intent.FLAG_ACTIVITY_SINGLE_TOP
पुन: निर्माण

1

प्रारंभ में मुझे काम करने के लिए FLAG_ACTIVITY_CLEAR_TOP होने में भी समस्या थी। आखिरकार मैं इसे (0x04000000) के मूल्य का उपयोग करके काम करने के लिए मिला। तो ऐसा लगता है कि एक ग्रहण / संकलक समस्या है। लेकिन दुर्भाग्य से जीवित गतिविधि फिर से शुरू हो जाती है, जो कि मैं नहीं चाहता। तो ऐसा लगता है कि कोई आसान उपाय नहीं है।

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