गतिविधि कैसे बंद करें और Android में पिछली गतिविधि पर वापस जाएं


144

मेरे पास एक मुख्य गतिविधि है, कि जब मैं एक बटन पर क्लिक करता हूं, तो एक नई गतिविधि शुरू करता है, मैंने ऐसा करने के लिए निम्नलिखित कोड का उपयोग किया:

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

उपरोक्त कोड मुख्य गतिविधि से चलाया गया था।

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

मैंने कॉल करने की कोशिश की है super.finish()और बसfinish() (नई गतिविधि से) लेकिन फिर यह मेरा पूरा एप्लिकेशन (मेरी मुख्य गतिविधि सहित) बंद कर देता है।

मैं अभी उस गतिविधि को कैसे बंद कर सकता हूं जो वर्तमान में फोकस में है, और फिर मुख्य गतिविधि पर वापस लौटें?

संपादित

यह तथ्य कि मेरे फोन का बैक बटन मेरे पूरे ऐप को बंद कर देता है, मुझे यह सोचने की ओर ले जाता है कि मैंने दूसरी गतिविधि गलत तरीके से शुरू कर दी है?


ठीक है मैं देख रहा हूँ,

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

सेटिंग्स गतिविधि के लिए जब मैं बैक बटन को धक्का देता हूं, तो यह मुख्य गतिविधि पर लौटता है।

मुख्य प्रश्न में ऊपर उल्लिखित गतिविधि के साथ यह केवल मेरे पूरे ऐप को बाहर निकालता है।

तो समस्या गतिविधि समाप्त करने के लिए कोड के साथ नहीं लगती है, लेकिन गतिविधि ही है।


4
आपको बैक बटन की भी आवश्यकता नहीं है, बस उपयोगकर्ता को फोन बैक की का उपयोग करने दें और आपको कुछ भी करने की आवश्यकता नहीं है।
होन गुयेन

फ़ोन बैक बटन एंट्री एप्लिकेशन बंद कर देता है, न कि मेरी सेकेंडरी एक्टिविटी। मैं मुख्य गतिविधि को बंद नहीं करना चाहता।
ज़ापोनोलिका

1
'बैक' बटन को ऐसा नहीं करना चाहिए - क्या आप अपना अधिक कोड दिखा सकते हैं?
पीजयबी

आपके संपादन के जवाब में, आपने जो पोस्ट किया है, उससे माध्यमिक गतिविधि अच्छी लगती है। मुझे लगता है कि टीजीएमसीयन के पास शायद सही जवाब है और आप अपने प्रकटन की जांच करते हैं।
पीजयबी

इस उत्तर को देखें मुझे लगता है कि इससे आपको मदद मिलेगी
मुहम्मद हेल्मी

जवाबों:


201

मुझे लगता है कि आप शुरू finish()करने से MainActivityपहले फोन कर रहे हैं SettingsActivity

परिदृश्य जो आपने वर्णित किया है वह दो तरीकों से होगा:

या तो

आपने अंदर के android:noHistory = "true"लिए निर्धारित किया MainActivityहैAndroidManifest.xml जिसके कारण MainActivityहैंfinish बैक की दबाने पर अपने आप जाता है।

या

अपने 'SettingsActivity' पर स्विच करने से पहले, आपने अपने फोन finish()में कॉल किया MainActivity, जो इसे मारता है। जब आप बैक बटन दबाते हैं, चूंकि स्टैक पॉप में कोई अन्य गतिविधि पूर्व निर्धारित नहीं होती है, तो यह मुख्य स्क्रीन पर वापस चली जाती है।


यही कारण है कि फोन का 'बैक' बटन भी मुख्य गतिविधि को खारिज कर देता है।
पीजयबी

डिबगिंग करते समय, मैंने देखा कि निष्पादन समाप्त होने के बाद भी जारी है (), इसलिए इसके अतिरिक्त रिटर्न लगाने की सलाह दी जाती है।
तक

क्या इस उत्तर में तीसरा कारण सिर्फ पहले का दोहराव नहीं है?
पांग

60

आप जिस गतिविधि पर हैं उसे केवल कॉल फिनिश () के द्वारा पिछली गतिविधि पर वापस जा सकते हैं। नोट समाप्त होने के बाद किसी भी कोड को नोट करें () कॉल चलेगी - आप इसे ठीक करने के लिए कॉलिंग फिनिश () के बाद रिटर्न कर सकते हैं।

यदि आप गतिविधि को एक पर वापस करना चाहते हैं, तो गतिविधि दो शुरू करते समय आपको आवश्यकता होती है:

startActivityForResults(myIntent, MY_REQUEST_CODE);

अपनी तथाकथित गतिविधि के अंदर आप ऑनक्रीट () पैरामीटर या उपयोग किए गए से आशय प्राप्त कर सकते हैं

getIntent();

एक गतिविधि में एक परिणाम वापस करने के लिए फिर गतिविधि दो में सेट करने के लिए

setResult(Activity.RESULT_OK, MyIntentToReturn);

अगर आपका लौटने का कोई इरादा नहीं है तो बस कहें

setResult(Activity.RESULT_OK);

यदि गतिविधि के बुरे परिणाम हैं, तो आप गतिविधि का उपयोग कर सकते हैं। RESULT_CANCELED (यह डिफ़ॉल्ट रूप से उपयोग किया जाता है)। फिर गतिविधि में आप एक करते हैं

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

गतिविधि समाप्त करने के लिए दो समान विधियों का उपयोग खत्म () के साथ करें जैसा कि ऊपर वर्णित आपके परिणामों के साथ पहले से ही निर्धारित है।


1
"खत्म होने के बाद किसी भी कोड पर ध्यान दें () कॉल चलेगी - आप इसे खत्म करने के लिए कॉल करने के बाद रिटर्न कर सकते हैं () इसे ठीक करने के लिए" मुझे लगता है कि 'फिक्स' शब्दों का एक बुरा विकल्प है। यह अधिक है जैसे आप निम्नलिखित पंक्तियों के निष्पादन से बच रहे हैं (फिक्सिंग नहीं)।
लो-तान

14

जब आप अपने बटन पर क्लिक करते हैं, तो आप इसे कॉल कर सकते हैं:

super.onBackPressed();

11

यदि आप उपयोग करते हैं, तो आप का उपयोग करना चाहिए

getActivity().onBackPressed();

यदि आप एकल गतिविधि का उपयोग करते हैं तो आप उपयोग कर सकते हैं

finish();

7

इस कोड को इसके बजाय आज़माएं finish:

onBackPressed();


2
एक्टिविबी से एक्टिवा तक वापस जाने के लिए ठीक काम करता है। टुकड़ों और एकल गतिविधियों के लिए @ ओस्मा इब्राहिम के उत्तर का उपयोग कर सकते हैं।
Eftekhari

4

आप इसे बहुत कठिन बना रहे हैं। अगर मैं समझता हूं कि आप सही ढंग से क्या करने की कोशिश कर रहे हैं, तो अंतर्निहित 'बैक' बटन और एंड्रॉइड स्वयं आपके लिए सभी काम करेंगे: http://developer.android.com/guide/compenders/tasks-and-back- stack.html

इसके अलावा, एक कस्टम "बैक" बटन को लागू करना कोर ऐप गुणवत्ता दिशानिर्देश UX-N1 का उल्लंघन करता है: http://developer.android.com/distribute/googleplay/quality/core.html


4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});

4

यह पूरा आवेदन बंद कर देता है:

this.finish();

यह संपूर्ण एप्लिकेशन को बंद कर देता है जैसा कि कहा जाता है कि वह प्रश्न करता है, न केवल वर्तमान गतिविधि, जैसा कि फोन बैक बटन करता है?
ज़ापानोलोगिका

मुझे कैमरा गतिविधि से पिछली गतिविधि कैसे मिली।
कोडरपीसी

2
नहीं, यह नहीं है। यह केवल वर्तमान गतिविधि को बंद करता है। देखें: developer.android.com/reference/android/app/…
Firzen

4

मेरा मानना ​​है कि आपकी दूसरी गतिविधि संभवतः बाल गतिविधि के रूप में आपकी मुख्य गतिविधि से जुड़ी नहीं है। अपनी AndroidManifest.xmlफ़ाइल की जाँच करें और देखें कि क्या <activity>आपके बच्चे की गतिविधि के लिए प्रविष्टि में एक android:parentActivityNameविशेषता शामिल है । यह कुछ इस तरह दिखना चाहिए:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

जब तक आप उस पर अन्य कार्य नहीं कर रहे हैं, तब तक finish()अपने फोन पर कॉल न करें, इससे MainActivityआपके onBackPressed()में ओवरराइड करने की आवश्यकता समाप्त SecondActivityहो जाती है। आप इस वापस बटन के लिए "जरूरत" लग रहा है, तो आप बस फोन कर सकते हैं finish()पर SecondActivityऔर है कि अपने पर ले जाएगा MainActivityजब तक आप नहीं बुलाया है के रूप में finish()उस पर


मैंने इस मार्ग की कोशिश की, लेकिन मेरे पास अनुक्रम में लगभग 10 स्क्रीन हैं जो उच्च संकल्प पीएनजी का उपयोग करते हैं। समस्या यह है कि स्क्रीन 7 के माध्यम से, बैक-स्टैक में सभी गतिविधियों के कारण यादों से बाहर डिवाइस। मैंने प्रत्येक गतिविधि पर कॉल समाप्त करने का निर्णय लिया, और इसने कचरा संग्रह की अनुमति देकर समस्या को ठीक किया, लेकिन अब बैक व्यवहार को मैन्युअल रूप से कोडित करने की आवश्यकता है क्योंकि बैक-स्टैक अब खाली है। क्या आपने इस समस्या में भाग लिया है या इसे संबोधित करने के लिए Android के किसी भी तंत्र को जानते हैं?
लो-टैन

आप बैक बटन क्या करना चाहते हैं? पिछले जो कुछ भी Activityथा उस पर वापस जाएं या हमेशा वापस जाएं MainActivity? इसके अलावा, यदि आप मेमोरी से बाहर चल रहे हैं, तो आपको डॉक्स के इस भागBitmaps को पढ़ना चाहिए । इसने मेरी मदद की
कोडमजिक

@ लो-टैन यदि आप पिछली गतिविधि पर वापस जाना चाहते हैं तो मुझे लगता है कि आपको अपनी छवियों के लिए मेमोरी प्रबंधन का पता लगाने और गतिविधियों को समाप्त करने की आवश्यकता है (शायद मेरे द्वारा दी गई लिंक के साथ)। अन्यथा, आपको गतिविधि के एक नए उदाहरण को फिर से बनाना होगा और यह पता लगाने की कोशिश करनी होगी कि किस पर वापस जाना है
codeMagic

मैं पिछले बटन को पिछली स्क्रीन पर जाना चाहूंगा। यह मूल रूप से ट्यूटोरियल स्क्रीन की एक श्रृंखला है, और उपयोगकर्ता आगे / पीछे जा सकता है। प्रत्येक स्क्रीन डिज़ाइन की जाती है और बहुत सारे pngs का उपयोग करता है - कभी-कभी pngs जो अधिकांश स्क्रीन को उठाते हैं (न कि केवल छोटे थंबनेल) इसलिए यह प्रत्येक स्क्रीन के लिए बहुत सारी मेमोरी को चूस रहा है।
लो-टैन

@ लो-टैन मुझे लगता है कि आप onBackPressed () विधि को ओवरराइड करना चाहते हैं और फिर मैन्युअल रूप से वह गतिविधि बनाएं, जिसमें आप जाना चाहते हैं। फिर आप उस पर समाप्त कर सकते हैं जिस पर आप हैं और पिछले एक को स्टार्टअप करें।
ज़ाप्नोलोगिका

1

मुझे नहीं पता कि यह उपयोगी भी है या नहीं, लेकिन मैं एक ही समस्या से जूझ रहा था और मुझे एक बहुत ही आसान तरीका मिल गया, केवल एक वैश्विक बूलियन चर और onResume () कार्रवाई के साथ। मेरे मामले में, मेरी गतिविधि C यदि एक विशिष्ट बटन में क्लिक की जाती है, तो उसे गतिविधि बी के खत्म () को ट्रिगर करना चाहिए!

एक्टिविटी_ए -> एक्टिविटी_ -> एक्टिविटी_सी

Activity_A (सामान्य रूप से गतिविधि_ खोलता है)

Activity_B (कुछ बटन पर क्लिक करने से Activity_C खुल जाता है):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

इसलिए, जब भी मैं गतिविधि C पर बटन क्लिक करता हूँ तो यह गतिविधि B का "onResume ()" फ़ंक्शन करेगा और गतिविधि A पर वापस जाएगा।


1
 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if ( id == android.R.id.home ) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

कोशिश करें कि यह टूलबार बैक बटन पर हार्डवेयर बैक बटन के रूप में काम करता है ।


यह एक मेरे लिए काम किया। मैं भी एक था MainActivity और एक SettingsActivity साथ android:parentActivityName=".MainActivity"दूसरे के लिए। यह कोड उपकरण पट्टी में उस होम / बैक बटन को संभालता है और स्टैक में पिछले एक पर लौटने वाली वर्तमान गतिविधि को समाप्त करता है। धन्यवाद।
मोर्टेलिस

1

खत्म पूरे आवेदन को बंद कर देता है, यह कुछ ऐसा है जिसे मैं एंड्रॉइड डेवलपमेंट में नफरत करता हूं खत्म नहीं है जो ठीक है लेकिन यह है कि वे बुद्धि ठीक नहीं रखते हैं ठीक वाक्यविन्यास उनके पास है

startActivity(intent)

क्यों नहीं

निकटता (आशय)?


1
क्या यह सवाल का जवाब देता है? या यह केवल एक सुझाव देने की कोशिश है? दोनों मामलों में, रेंट अनावश्यक है और एसओ पर स्वागत नहीं है
गाइल्स गोइलार्डेट

1

हमने एक समान स्थिति का सामना किया।

गतिविधि 1 (उद्घाटन) -> गतिविधि 2 (पूर्वावलोकन) -> गतिविधि 3 (विस्तार)

गलत "बैक प्रेस पर" प्रतिक्रिया

  • गतिविधि 3 पर डिवाइस बैक प्रेस गतिविधि 2 को भी बंद कर देगा।

मैंने ऊपर पोस्ट किए गए सभी उत्तरों की जाँच की है और उनमें से कोई भी काम नहीं किया है। गतिविधि 2 और गतिविधि 3 के बीच संक्रमण के लिए जावा सिंटैक्स को सही होने के लिए समीक्षा की गई थी।

एक 3 पार्टी ऐप को कॉल करने पर कोडिंग से ताज़ा। एक गतिविधि द्वारा। हमने कॉन्फ़िगरेशन कोण की जांच करने का निर्णय लिया - अंततः हमें समस्या के मूल कारण की पहचान करने में सक्षम किया।

क्षेत्र : गतिविधि 2 (कॉलर) का कॉन्फ़िगरेशन।

मूल कारण :

android:launchMode="singleInstance"

समाधान :

android:launchMode="singleTask"

जाहिरा तौर पर इस "बैक प्रेस पर" मुद्दे पर सिंगलइनस्टेंस कॉलिंग एक्टिविटी के साथ एक उदाहरण में इनवॉइस एक्टिविटीज पर विचार करता है, जबकि सिंगलटैच इनवॉल्ड एक्टिविटीज के लिए बैक प्रेस पर काम करने के लिए पर्याप्त अपनी पहचान रखने की अनुमति देगा।


0
{ getApplicationContext.finish();   }

इस विधि को आजमाएं ।।


हालांकि यह कोड ब्लॉक प्रश्न का उत्तर दे सकता है, यह सबसे अच्छा होगा यदि आप ऐसा क्यों करते हैं इसके लिए थोड़ा स्पष्टीकरण प्रदान कर सकते हैं।
डेविड

0

यह संभव हो सकता है कि आप कॉल खत्म कर रहे हैं (); बटन क्लिक करने की घटना में इसलिए मुख्य गतिविधि बंद हो जाती है जब आप बटन पर क्लिक करते हैं और जब आप अगली गतिविधि से वापस आ रहे होते हैं तो एप्लिकेशन बाहर निकल जाता है क्योंकि मुख्य गतिविधि पहले से ही बंद है और कोई सक्रिय गतिविधि नहीं है।


0

आपकी गतिविधि का ऑनक्रिट विधि निम्नलिखित कोड लिखें।

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

फिर आपकी गतिविधि के चयनित तरीकों को ओवरराइड करें

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

और आप जाने के लिए अच्छे हैं।


0

आपको अपने MainActivity में इसका इस्तेमाल करना होगा

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

झंडा कई कार्यों को शुरू करेगा जो आपकी मेनऐक्टिविटी को बनाए रखेगा, जब आप कॉल खत्म करेंगे तो यह दूसरी गतिविधि को मार देगा और आपको मेनऐक्टिविटी में वापस लाएगा।

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