android - इतिहास स्टैक से एक गतिविधि को हटा रहा है




android-activity activity-lifecycle (9)

मेरा ऐप पहली बार उपयोगकर्ता द्वारा ऐप चलाते समय एक साइनअप गतिविधि दिखाता है, ऐसा लगता है:

  1. गतिविधि स्प्लैशस्क्रीन (गेम में आपका स्वागत है, खाते के लिए साइन अप करें?)
  2. ActivitySplashScreenSignUp (बढ़िया, इस जानकारी को भरें)
  3. ActivityGameMain (मुख्य गेम स्क्रीन)

इसलिए जब गतिविधियां प्रत्येक स्क्रीन पर एक बटन के माध्यम से क्लिक करती हैं, तो गतिविधियां एक दूसरे को ठीक उसी क्रम में लॉन्च करती हैं।

जब उपयोगकर्ता गतिविधि # 2 से # 3 तक जाता है, तो क्या इतिहास स्टैक से # 1 और # 2 को मिटा देना संभव है? मुझे यह अच्छा लगेगा कि यदि उपयोगकर्ता # 3 पर है, और बैक बटन हिट करता है, तो वे स्प्लैश स्क्रीन पर वापस होमस्क्रीन पर जाते हैं।

मुझे लगता है कि मैं इसे कार्यों के साथ पूरा कर सकता हूं (यानी # 3 पर एक नया कार्य शुरू करें) लेकिन देखना चाहता था कि क्या सरल विधि थी,

धन्यवाद


अगली लॉन्च करते समय आप गतिविधि स्टैक से पिछली गतिविधि को हटाने के लिए अग्रेषण का उपयोग कर सकते हैं। एपिडेमोस में इसका एक उदाहरण है , लेकिन मूल रूप से आप जो भी कर रहे हैं वह startActivity finish() को कॉल finish() तुरंत बाद finish() को कॉल कर रहा है।


इसे इस्तेमाल करे:

intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

यह एपीआई स्तर 1 है, link जांच link


एपीआई> = 15 एपीआई 23 अन्य समाधान के लिए मेरे मामले में काम नहीं करता है। आखिरकार मुझे यह मिल गया।

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

बस इसे शुरू करें। फिनिश () शुरू करने से पहले सक्रियता (इरादा) इस तरह-

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

मैं इस तरह का उपयोग करता हूँ।

Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

मैनिफेस्ट में आप जोड़ सकते हैं:

android:noHistory="true"

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

आप भी कॉल कर सकते हैं

finish()

प्रारंभ करने के तुरंत बाद सक्रियता (..)


यह संभवतः ऐसा करने का आदर्श तरीका नहीं है। अगर किसी के पास बेहतर तरीका है, तो मैं इसे लागू करने की उम्मीद कर रहा हूं। यहां बताया गया है कि मैंने इस विशिष्ट कार्य को प्री-वर्जन -11 एसडीके के साथ कैसे पूरा किया।

प्रत्येक कक्षा में आप स्पष्ट समय के साथ दूर जाना चाहते हैं, आपको यह करने की ज़रूरत है:

    ... interesting code stuff ...
    Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
    startActivityForResult(i, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == R.string.unwind_stack_result_id) {
        this.setResult(R.string.unwind_stack_result_id);
        this.finish();
    }
}

तो जिसको स्टैक से पॉप की श्रृंखला को सेट करने की आवश्यकता होती है उसे केवल इसे कॉल करने की आवश्यकता होती है जब आप इसे शुरू करना चाहते हैं:

NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();

तब गतिविधियां ढेर पर नहीं हैं!
लोगों को याद रखें, कि आप एक गतिविधि शुरू कर सकते हैं, और फिर इसके पीछे सफाई शुरू कर सकते हैं, निष्पादन एक एकल (ui) धागा का पालन नहीं करता है।



आप android:noHistory को सेट करके इसे प्राप्त कर सकते हैं android:noHistory आपकी AndroidManifest.xml फ़ाइल में प्रासंगिक <activity> प्रविष्टियों में "true" लिए कोई android:noHistory विशेषता नहीं है। उदाहरण के लिए:

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




activity-lifecycle