पिछली गतिविधि में वापस जाने से कैसे रोकें?


210

जब फ़ोन पर BACK बटन दबाया जाता है, तो मैं एक विशिष्ट गतिविधि को उसके पिछले हिस्से में लौटने से रोकना चाहता हूँ।

विशेष रूप से, मेरे पास लॉगिन और साइन अप स्क्रीन हैं, दोनों एक नई गतिविधि शुरू करते हैं जिसे HomeScreenसफल लॉगिन / साइनअप कहा जाता है। एक बार होमस्क्रीन शुरू हो जाने के बाद, मैं उपयोगकर्ताओं को लॉगिन पर वापस जाने से रोकना चाहता हूं या बैक कुंजी दबाकर स्क्रीन को साइन अप करना चाहता हूं।

मैंने उपयोग करने का प्रयास किया Intent.FLAG_ACTIVITY_NO_HISTORY, लेकिन चूंकि एप्लिकेशन में फेसबुक एकीकरण है, जब 'फेसबुक के साथ लॉगिन' का उपयोग किया जाता है, तो फेसबुक को प्रारंभिक लॉगिन स्क्रीन पर लौटना चाहिए, इसलिए मुझे इन गतिविधियों का इतिहास रखना चाहिए।

HomeScreenजब बटन दबाया जाता है और मैं उपयोग करता हूं तो मैंने सीधे एक एप्लिकेशन को समाप्त करने के लिए BACK बटन के व्यवहार को ओवरराइड करने के बारे में सोचा

@Override
public void onBackPressed() {
    finish();
}

लेकिन वह भी काम नहीं करता है।


1
बस स्पष्ट करने के लिए, आप फेसबुक को छोड़कर सभी के लिए व्यवहार वापस लेने की कोशिश कर रहे हैं?
hasxz

2
कुछ अर्थों में हाँ, लेकिन वास्तव में मैं जो चाहता हूं वह एक सफल लॉगिन के बाद होता है और होमस्क्रीन खुल जाता है, उपयोगकर्ता को बैक बटन दबाकर लॉगिन स्क्रीन पर वापस जाने में सक्षम नहीं होना चाहिए। उदाहरण के लिए ट्विटर या फोरस्क्वेयर की तरह, एक बार जब हम उन ऐप्स में लॉग इन करते हैं, तो हम लॉग इन पेज तब तक नहीं देखते हैं जब तक हम लॉग इन नहीं करते (भले ही हम लॉग इन करने के बाद बैक प्रेस करें)।
ecem

जवाबों:


345

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


2
अगर मैं पिछली गतिविधि में थ्रेड को चालू रखना चाहूं तो क्या होगा?
AlleyOOP

2
आप तब मेरे दृष्टिकोण के साथ नहीं जाना चाहेंगे। कॉलिंग फिनिश () गतिविधि को मारने जा रही है। क्या आप अपनी प्रक्रिया शुरू कर सकते हैं जिसे आप उस गतिविधि में चलाना चाहते हैं जो आप करने जा रहे हैं?
कोडर

7
नोट: यदि आप finishएक साझा संक्रमण के दौरान कॉल करते हैं तो आपको पिछली गतिविधि के माध्यम से एक ब्लीड मिल सकता है। उदाहरण के लिए, यदि आपके पास HomeActivity-> IntermediateActivity-> FinalActivity, और आप कॉल finish()करने के IntermediateActivityतुरंत बाद कॉल FinalActivityकरेंगे , तो आपको HomeActivityएक संक्षिप्त क्षण दिखाई देगा ।
डेविड मर्डोक

101

निम्नलिखित समाधान सामान्य लॉगिन / मुख्य गतिविधि परिदृश्य या अवरुद्ध स्क्रीन को लागू करने में बहुत उपयोगी हो सकता है।

पिछली गतिविधि पर वापस जाने के बजाय एप्लिकेशन को कम करने के लिए, आप onBackPressed()इस तरह से ओवरराइड कर सकते हैं :

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot)अपनी बैक स्टैक को छोड़ देता है जैसा कि है, बस अपने कार्य (सभी गतिविधियों) को पृष्ठभूमि में रखता है। जैसे ही यूजर ने होम बटन दबाया

पैरामीटर boolean nonRoot- यदि गलत है तो यह केवल तभी काम करता है यदि गतिविधि एक कार्य की जड़ है; अगर यह सच है तो यह किसी कार्य में किसी भी गतिविधि के लिए काम करेगा।


3
एक लॉगिन स्क्रीन के लिए बिल्कुल सही है क्योंकि यह इतिहास को बरकरार रखता है।
हैकमॉडफोर्ड

धन्यवाद, मैंने लगभग तीन दिनों तक इसे खोजने की कोशिश की। Android की वजह से: noHistory = "true" गतिविधि के लिए ध्वज अपेक्षित रूप से काम नहीं करता है (noHistory flag न्यूनतम करने के बाद गतिविधि को फिर से बनाता है) और खत्म () कभी-कभी मेरे लिए काम नहीं करता है, लेकिन मैं अभी भी क्यों नहीं समझा।
डेन्शोव

37

मुझे यकीन नहीं है कि आप क्या चाहते हैं, लेकिन ऐसा लगता है कि यह संभव होना चाहिए, और यह भी लगता है कि आप पहले से ही सही रास्ते पर हैं।

यहां कुछ लिंक दिए गए हैं जो मदद कर सकते हैं:

Android में वापस बटन अक्षम करें

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

मैं कुछ गतिविधि के लिए 'गो बैक' को कैसे निष्क्रिय कर सकता हूं?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>

1
मैं फेसबुक के मुद्दे के कारण noHistory विकल्प का उपयोग नहीं कर सकता, जिसे मैंने अपने प्रश्न में समझाने की कोशिश की और टिप्पणियों में से एक भी। लेकिन BACK बटन वाली चीज इसे डिसेबल नहीं कर रही है, बल्कि इसे पूरे एप्लिकेशन से बाहर कर देती है, जैसे System.exit(0)कहा जाता है (मुझे पता है कि यह सबसे अच्छा अभ्यास नहीं है, लेकिन मैं सिर्फ एक उदाहरण देना चाहता हूं)।
ecem

धन्यवाद इस महान काम किया। केवल सुझाव मैं यहाँ करूँगा, वापसी की कोई आवश्यकता नहीं है। बस super.onBackPressed () को हटा दें, और विधि को खाली छोड़ दें। यह ठीक काम करता है
हाइपरकोडर

20

आपके मामले के लिए दो समाधान हैं, गतिविधि ए गतिविधि बी शुरू करता है, लेकिन आप गतिविधि बी में गतिविधि ए पर वापस नहीं जाना चाहते हैं।

1. पिछली गतिविधि ए को बैक स्टैक से हटा दिया गया।

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2. गतिविधि बी में अक्षम बैक बटन कार्रवाई।

नीचे दिए गए बैक इवेंट को रोकने के दो तरीके हैं,

1) दृष्टिकोण की सिफारिश करें

@Override
public void onBackPressed() {
}

2) ओवरराइड ऑनकेडाउन विधि

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

आशा है कि यह उपयोगी है, लेकिन फिर भी आपकी स्थितियों पर निर्भर करता है।


3
क्या onBackPressed () को अक्षम करना बुरा उपयोगकर्ता अनुभव नहीं है?
सी। स्केजेराल

यह पूरी तरह से इस बात पर निर्भर करता है कि आप क्या बनाने की कोशिश कर रहे हैं, ऐप में काम करने की जरूरत है।
14:30 बजे user3099225

यह आश्चर्यजनक है कि मैं पहली विधि का उपयोग करने के बारे में पूरी तरह से कैसे भूल गया finish()। अनावश्यक रूप से nohistoryविशेषता, आशय के झंडे, मूल गतिविधि गतिविधि टैग, आदि के साथ उखाड़ फेंका गया ! मूर्ख, उत्तर के लिए धन्यवाद!
वरुण

8

चूँकि पहले से ही कई बेहतरीन समाधान सुझाए गए हैं, इसलिए बीमार अधिक स्पष्ट व्याख्या देने की कोशिश करते हैं।

पिछली गतिविधि पर वापस जाने को कैसे छोड़ें ?

पिछली गतिविधि को बैकस्टैक से निकालें। सरल

बैकस्टैक से पिछली गतिविधि कैसे निकालें?

कॉल finish()विधि

सामान्य प्रवाह:

यहां छवि विवरण दर्ज करें
सभी गतिविधियों को बैकस्ट के रूप में जाना जाने वाले स्टैक में संग्रहीत किया जाता है।
जब आप एक नई गतिविधि शुरू करते हैं ( startActivity(...)तब) नई गतिविधि स्टैक के शीर्ष पर धकेल दी जाती है और जब आप बैक बटन दबाते हैं तो गतिविधि स्टैक से पॉप अप हो जाती है। ध्यान देने के लिए
एक महत्वपूर्ण बिंदु यह है कि जब बैक बटन दबाया जाता है तो finish();विधि को आंतरिक रूप से कहा जाता है। यह onBackPressed () विधि का डिफ़ॉल्ट व्यवहार है।

तो अगर आप गतिविधि बी को छोड़ना चाहते हैं?

यानी ए <--- सी

गतिविधि बी में finish();आपके बाद बस विधि जोड़ेंstartActvity(...)

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

यहां छवि विवरण दर्ज करें


6

finish()आपको वर्तमान गतिविधि को बंद करने का तरीका देता है संपूर्ण अनुप्रयोग नहीं। और आप बेहतर तरीके से आवेदन को मारने के तरीकों की तलाश करने की कोशिश नहीं करते हैं। थोड़ी सलाह।

आप के संयोजन की कोशिश की है Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? Intentगतिविधि शुरू करने में इस झंडे का उपयोग करना याद रखें !


2
FLAG_ACTIVITY_NO_HISTORYजब फेसबुक के साथ लॉगिन का उपयोग किया जाता है तो फेसबुक के कॉलबैक पर कब्जा करने के लिए मेरे लॉगिनस्क्रीन को रोकता है। क्योंकि एक बार फ़ोकस लॉगिनस्क्रीन से बाहर चला जाता है तो इसे फिर से शुरू नहीं किया जा सकता है (क्योंकि कोई इतिहास नहीं है)। लेकिन मैंने इसके साथ कोशिश नहीं की है Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS, मैं इसकी जाँच करूँगा, धन्यवाद!
ecem

finish()विधि के बारे में भी धन्यवाद , मुझे इसके बारे में नहीं पता था।
ecem


3

paulsm4 का उत्तर सही है। यदि onBackPressed()आप वापस लौटते हैं, तो यह बैक बटन को निष्क्रिय कर देगा। हालाँकि, मुझे लगता है कि आपके उपयोग के मामले को देखते हुए एक बेहतर दृष्टिकोण गतिविधि तर्क को फ्लिप करना है, यानी अपने घर की गतिविधि को मुख्य बनाएं, जांचें कि क्या उपयोगकर्ता वहां साइन इन है, यदि नहीं, तो गतिविधि में साइन शुरू करें। कारण यह है कि यदि आप अपनी मुख्य गतिविधि में बैक बटन को ओवरराइड करते हैं, तो अधिकांश उपयोगकर्ता भ्रमित हो जाते हैं जब वे वापस दबाते हैं और आपका ऐप कुछ भी नहीं करता है।



3

यह तरीका ठीक काम कर रहा है

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

2

बस ऑनकेडाउन विधि को ओवरराइड करें और जांचें कि बैक बटन दबाया गया था या नहीं।

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}

1
@Override
public void onBackPressed() {
}

जब आप onBackPressed()सिर्फ हटाते हैं super.onBackPressed();और वह काम करना चाहिए


1

डाल

finish();

एक्टिविटीस्टार्ट के तुरंत बाद गतिविधि को रोकने के लिए इसे वापस जाने के किसी भी तरीके को रोकने के लिए। फिर जोड़िए

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

जिस गतिविधि को आप शुरू कर रहे हैं।

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