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




android-intent android-activity (20)

  1. android:launchMode="singleTop" जोड़ें android:launchMode="singleTop" गतिविधि ए के लिए अपने मैनिफेस्ट में गतिविधि तत्व में android:launchMode="singleTop"
  2. फिर गतिविधि ए शुरू करते समय intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) और intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) उपयोग करें।

इसका अर्थ यह है कि जब गतिविधि ए लॉन्च किया जाता है, तो इसके शीर्ष पर सभी कार्यों को साफ़ कर दिया जाता है ताकि ए शीर्ष पर हो। रूट पर ए के साथ एक नया बैक स्टैक बनाया गया है, और singleTop का उपयोग करके आप सुनिश्चित करते हैं कि आप केवल एक बार लॉन्च करें (क्योंकि ए अब शीर्ष पर है ..._CLEAR_TOP )।

एंड्रॉइड में मेरे पास कुछ गतिविधियां हैं, आइए ए, बी, सी।

एआई में बी को खोलने के लिए इस कोड का उपयोग करें:

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

बीआई में इस कोड का उपयोग सी खोलने के लिए करें:

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

जब उपयोगकर्ता सीआई में एक बटन टैप करता है तो ए पर वापस जाना चाहता है और बैक स्टैक साफ़ करना चाहता है (बी और सी दोनों बंद करें)। तो जब उपयोगकर्ता बैक बटन बी और सी का उपयोग नहीं करेगा, तो मैं निम्नलिखित कोशिश कर रहा हूं:

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

लेकिन जब मैं गतिविधि ए में वापस आ जाता हूं तो बैक बटन का उपयोग करते हुए बी और सी अभी भी दिख रहे हैं। मैं इससे कैसे बच सकता हूं?


FinAffinity () का उपयोग करें; कार्य सी में जब कार्य शुरू करना ए बैकस्टैक गतिविधियों को साफ़ करने के लिए।


आप Activity C से अपनी Activity A को कॉल करने के लिए इस उदाहरण का उपयोग कर सकते हैं

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);


इरादे में कोई इतिहास झंडा जोड़ें।

गतिविधि बी में, नीचे गतिविधि सी शुरू करें >>>>>>

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();

उपयोग करने का प्रयास करें

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

और नहीं

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

एपीआई 16 (जेली बीन) में शुरू करना, आप केवल finishAffinity() कॉल कर सकते हैं।

अब आप संगतता लाइब्रेरी के साथ ActivityCompat.finishAffinity(Activity activity) भी कॉल कर सकते हैं।

मैनिफेस्ट में टास्क एफ़िनिटी को उस पैकेज के नाम पर अद्वितीय पैकेज सेट करने के लिए सुनिश्चित करें।

अधिक जानकारी के लिए देखें:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29


नई गतिविधि शुरू करने और अन्य सभी एसीविटी स्टैक या बैक सैकैक को बंद या नष्ट करने के लिए इस कोड का उपयोग करें ...

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

प्रकट में

android:launchMode="singleTask"

तथा

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

मुझे यहां थोड़ा भ्रामक जवाब मिल गए हैं क्योंकि मूल प्रश्न में कोड मेरे लिए ठीक काम करता प्रतीत होता है?

ए रूट गतिविधि होने के साथ, इसे केवल FLAG_ACTIVITY_CLEAR_TOP के साथ बी या सी से शुरू करने से बैक स्टैक से बी और सी हटा दिया जाता है।


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

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

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


यदि आपके एप्लिकेशन में न्यूनतम एसडीके संस्करण 16 है तो आप फिनिशएफ़िनिटी () का उपयोग कर सकते हैं

वर्तमान कार्य में इस गतिविधि को तुरंत नीचे की सभी गतिविधियों को समाप्त करें जिसमें समान संबंध है।

यह मेरे लिए काम है शीर्ष भुगतान स्क्रीन में सभी बैक-स्टैक सक्रियताओं को हटा दें,

 @Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29


यह मुझे लंबे समय तक परेशान करता है। अंत में मैंने इसे करने से इसे काम किया:

खंड में, उपयोग करें:

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

गतिविधि में, उपयोग करें ( Intent.FLAG_ACTIVITY_CLEAR_TASK मुकाबले एक और इरादा ध्वज Intent.FLAG_ACTIVITY_CLEAR_TASK जोड़ें):

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

यह मेरे लिए बैकप्रेस के साथ काम किया:

public void onBackPressed()
{
    Intent intent = new Intent(ImageUploadActivity.this, InputDataActivity.class);

    Intent myIntent = new Intent(this, ImageUploadActivity.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
   finish();
}

यह वास्तव में पुराना उत्तर है और मुझे वास्तव में बैकस्टैक को साफ़ करने के एकमात्र उद्देश्य के लिए उचित समाधान नहीं मिला, मैंने अपना खुद का बैकस्टैक बनाने का फैसला किया, जो कि एक ढेर टीबी भी नहीं है, लेकिन इसमें नहीं है होने के लिए, क्योंकि हम इसमें सबकुछ साफ़ करना चाहते हैं;

हर बार बैकस्टैक को संभालने का ओवरहेड होता है, लेकिन यह मुझे आवश्यक नियंत्रण देता है;

सबसे पहले गतिविधियों की सार्वजनिक स्थैतिक सूची (या टुकड़े, जो भी आपको चाहिए) घोषित करें;

public static ArrayList <Activity> backStack = new ArrayList<>();

और अन्य सभी गतिविधियों के अंदर क्रिएट विधि:

MainActivity.backStack.add(this);

और अंत में, जब आप बैकस्टैक को साफ़ करना चाहते हैं, तो बस कॉल करें:

public static void killBackStack () {
    for (Activity ac : backStack) {
        if (ac != null)
            ac.finish();
    }
}

संबंधित गतिविधि के लिए प्रकट फ़ाइल में जोड़ने के बारे में क्या:

android:noHistory="true"

बी और सी की गतिविधि परिभाषा के लिए? उन्हें बैकस्टैक में नहीं जोड़ा जाएगा। सुनिश्चित नहीं है कि आप यही चाहते हैं।


FLAG_ACTIVITY_NEW_TASK के दस्तावेज़ों में वर्णित FLAG_ACTIVITY_NEW_TASK जोड़ने का प्रयास करें:

इस लॉन्च मोड का उपयोग FLAG_ACTIVITY_NEW_TASK के संयोजन के साथ भी अच्छे प्रभाव के लिए किया जा सकता है: यदि किसी कार्य की मूल गतिविधि शुरू करने के लिए उपयोग किया जाता है, तो यह उस कार्य का वर्तमान में चल रहे उदाहरण को अग्रभूमि में लाएगा, और उसके बाद इसे रूट स्थिति में साफ़ कर देगा। यह विशेष रूप से उपयोगी है, उदाहरण के लिए, अधिसूचना प्रबंधक से एक गतिविधि लॉन्च करते समय।

तो A लॉन्च करने के लिए आपका कोड होगा:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
finish(); // call this to finish the current activity

साफ़ बैक साइड के लिए setFlags () विधि का उपयोग करें, सभी गतिविधियों को बंद करें और अपनी सक्रियता शुरू करें

Intent intent = new Intent(getApplicationContext(), yourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

इतिहास स्टैक से एक गतिविधि को हटाने में Wakka अनुसार ...

android:noHistory="true" जोड़ें android:noHistory="true" आपके <activity> में AndroidManifest.xml में विशेषता है:

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

Use finishAffinity() to clear all backstack with existing one.

Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, 

    - Activity B will be finished / removing from stack.
    - Activity A will be finished / removing from stack.
    - Activity C will finished / removing from stack.

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




clear