एंड्रॉइड - "बैक" बटन को ओवरराइड कैसे करें ताकि यह मेरी गतिविधि को समाप्त न करें ()?


199

वर्तमान में मेरे पास एक गतिविधि है कि जब इसे प्रदर्शित किया जाता है तो अधिसूचना भी अधिसूचना पट्टी में प्रदर्शित हो जाएगी।

ऐसा तब होता है जब उपयोगकर्ता घर पर प्रेस करता है और गतिविधि पृष्ठभूमि पर धकेल दी जाती है, तो वे अधिसूचना के माध्यम से गतिविधि में वापस आ सकते हैं।

समस्या तब आती है जब कोई उपयोगकर्ता बैक बटन दबाता है, तो मेरी गतिविधि नष्ट हो जाती है, लेकिन अधिसूचना बनी रहती है क्योंकि मैं चाहता हूं कि उपयोगकर्ता वापस प्रेस करने में सक्षम हो लेकिन फिर भी अधिसूचना के माध्यम से गतिविधि में सक्षम हो। लेकिन जब कोई USER इसे आज़माता है तो मुझे Null पॉइंटर्स मिलते हैं क्योंकि पुराने को वापस लाने के बजाय एक नई गतिविधि शुरू करने की कोशिश कर रहा है।

इसलिए अनिवार्य रूप से मैं बैक बटन को होम बटन के समान कार्य करना चाहता हूं और यहां बताया गया है कि मैंने अब तक कैसे प्रयास किया है:


        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

        public void onBackPressed() {
            Log.d("CDA", "onBackPressed Called");
            Intent setIntent = new Intent(Intent.ACTION_MAIN);
            setIntent.addCategory(Intent.CATEGORY_HOME);
            setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(setIntent); 

            return;
        }   

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


इसी तरह का एक सवाल है: stackoverflow.com/questions/2459848/…
aleung

1
इसी तरह के जवाब .. stackoverflow.com/questions/5914040/…
ज़ार ई अहमर

इसके अलावा, मुझे लगता है कि आपको अपना कोड बदलकर `if (Integer.parseInt (android.os.Build.VERSION.SDK)> 5 , the <` एक होना चाहिए >
SudoPlz

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

यहां देखें उदाहरण एप्लिकेशन कोड freakyjolly.com/how-to-add-back-arrow-in-android-activity
कोड स्पाई

जवाबों:


276

अपने प्रमुख श्रोता निकालें या वापसी true, जब आपके पास KEY_BACK

तुम बस बैक की (सुनिश्चित करें कि कॉल करने के लिए नहीं पकड़ने के लिए निम्नलिखित की जरूरत सुपर में onBackPressed())।

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

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}

70

कोड की केवल एक पंक्ति के साथ इसे लागू करना आसान था:

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

यह स्वीकृत उत्तर होना चाहिए। यह वही करता है जो सवाल पूछ रहा है और कार्यक्षमता में निर्मित स्वच्छ का उपयोग कर रहा है।
Shadoninja

थैंक्यू :) क्या आप इसके पीछे की अवधारणा को विस्तृत कर सकते हैं?
फारुख फैजी

1
आप ऑनबैकबाइडेड () ईवेंट को ओवरराइड करते हैं, जिससे यह गतिविधि को पीछे ले जाता है।
गिलहरी

1
जब आप ऐप को होम स्क्रीन से दोबारा लॉन्च करेंगे (यदि कार्य स्टैक पर कोई अन्य गतिविधि है) तो यह समाधान वापस नहीं लाएगा।
इगोरगानापोलस्की

12

मुझे लगता है कि आप जो चाहते हैं वह बैक बटन को ओवरराइड नहीं करना है (यह सिर्फ एक अच्छा विचार नहीं लगता है - एंड्रॉइड ओएस उस व्यवहार को परिभाषित करता है, इसे क्यों बदलें?), लेकिन गतिविधि लाइफसाइकल का उपयोग करने के लिए और अपनी सेटिंग्स / डेटा को बनाए रखने के लिए? onSaveInstanceState (बंडल) घटना।

@Override
onSaveInstanceState(Bundle frozenState) {
    frozenState.putSerializable("object_key",
        someSerializableClassYouWantToPersist);
    // etc. until you have everything important stored in the bundle
}

तब आप onCreate (बंडल) का उपयोग करते हैं, जो कि बनी हुई बंडल से सब कुछ प्राप्त करने और अपने राज्य को फिर से बनाने के लिए उपयोग करते हैं।

@Override
onCreate(Bundle savedInstanceState) {
    if(savedInstanceState!=null){ //It could be null if starting the app.
        mCustomObject = savedInstanceState.getSerializable("object_key");
    }
    // etc. until you have reloaded everything you stored
}

आपको सही दिशा में इंगित करने के लिए उपरोक्त पेसो-कोड पर विचार करें। गतिविधि जीवनचक्र पर पढ़ने से आपको जो कुछ भी खोज रहे हैं उसे पूरा करने में सबसे अच्छा तरीका निर्धारित करने में मदद मिलेगी।


हाय Kiswa, यह सच है, मैं डिफ़ॉल्ट व्यवहार को बदलना नहीं चाहता। मैंने onSavedInstanceState का उपयोग करने की कोशिश की है और यह काम नहीं कर रहा था, लेकिन मुझे विश्वास है कि मैंने अब अपनी त्रुटि देखी है। धन्यवाद
डोनल Rafferty

5
मैं कम से कम कुछ स्थितियों में आया हूं जहां मैं वास्तव में नई गतिविधियां शुरू किए बिना मानक गतिविधि स्टैक व्यवहार का अनुकरण करना चाहता था। इन मामलों में, मुझे लगता है, डिफ़ॉल्ट onBackPressed () व्यवहार को ओवरराइड करना उचित है। सामान्य तौर पर, हालांकि, मैं सहमत हूं: ओवरराइडिंग से बचें।
मैट ब्रायनकॉन

4
मैं @Matt से सहमत हूं। मैं वर्तमान में एक क्रॉस प्लेटफॉर्म गेम पर काम कर रहा हूं जो NDK का उपयोग करता है। जैसे, यह आसान है अगर सब कुछ एक गतिविधि है। इस वजह से, बैक बटन का डिफ़ॉल्ट व्यवहार एप्लिकेशन से बचने के लिए है, जो कि अधिकांश उपयोगकर्ताओं से अपेक्षा नहीं है। इसलिए मुझे गतिविधि को अलग तरह से करने के लिए डिफ़ॉल्ट व्यवहार को अधिलेखित करना पड़ा, जैसे कि उपयोगकर्ता वास्तव में एक अलग गतिविधि में चले गए थे, और केवल कुछ निश्चित गड़बड़ी में ऐप छोड़ दिया था।
लीफ एंडरसन

1
OnSaveInstanceState और डेटा को पूरी तरह से अलग प्रश्न सहेजना नहीं है?
टेड

@Ted -if आप कह रहे हैं कि onSaveInstanceState के विज्ञापन में, ऐसे कोड की भी आवश्यकता होती है जो गैर-UI ऐप डेटा को बनाए रखते हैं, तो मैं सहमत हूं। जैसे ही आप अग्रभूमि को त्याग देते हैं, आपका ऐप आगे की चेतावनी के साथ नहीं मारा जा सकता है। हमेशा किसी भी चीज को बचाना चाहिए जो मायने रखता है। दूसरी ओर, मुझे लगता है कि ऐप जीवनचक्र के तरीकों को कहा जाएगा, भले ही आप ऐप को छिपाने के लिए किस तकनीक का उपयोग करते हैं, लेकिन इसे इधर-उधर रखें, इसलिए केवल इस मामले के लिए सेव लॉजिक जोड़ना आवश्यक नहीं होना चाहिए। आपके एप्लिकेशन को सभी सही स्थानों पर उस कोड की आवश्यकता है।
टूलमेकरसैट

11

बस यह करो ।।

@Override
public void onBackPressed() {
    //super.onBackPressed();
}

//super.onBackPressed () पर टिप्पणी करना; चाल चलेगा


1
एक उपयोगी अवलोकन, लेकिन यह बैक बटन को कुछ भी नहीं करने का कारण नहीं होगा, जैसे कि यह टूट गया हो? यह एक अच्छी बात नहीं है - उपयोगकर्ताओं के लिए भ्रमित करना और परेशान करना। IMHO को होम बटन की तरह कार्य करने के लिए एक अन्य उत्तर से तर्क जोड़ना होगा, जैसा कि प्रश्न में अनुरोध किया गया था। स्वीकृत उत्तर में उल्लेख है कि वे जानबूझकर सुपर विधि नहीं कह रहे थे।
टूलमेकरसैट

जी हां आप बिल्कुल सही हैं। यह सिर्फ बैक बटन को ओवरराइड करेगा और तब तक कुछ नहीं करेगा जब तक कि आप वहां कुछ तर्क नहीं रखेंगे। आवेदन को बंद करने के लिए बटन को दो बार दबाने की शर्त हो सकती है या आप किसी चालू ऑपरेशन (प्रगति संवाद) आदि को निष्क्रिय करना चाहते हैं, लेकिन इसकी आवश्यकता पूरी तरह से होती है।
androCoder-BD 15


3

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

import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;

/**
 * Activity where the home action bar button behaves like back by default
 */
public class BackActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupHomeButton();
    }

    private void setupHomeButton() {
        final ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }
    }

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

    protected void onMenuHomePressed() {
        onBackPressed();
    }
}

अपनी गतिविधि में उपयोग का उदाहरण:

public class SomeActivity extends BackActivity {

    // ....

    @Override
    public void onBackPressed()
    {
        // Example of logic
        if ( yourConditionToOverride ) {
            // ... do your logic ...
        } else {
            super.onBackPressed();
        }
    }    
}

1
@Override
public void onBackPressed() {
// Put your code here.
}

//I had to go back to the dashboard. Hence,

@Override
public void onBackPressed() {
    Intent intent = new Intent(this,Dashboard.class);
    startActivity(intent);
}
Just write this above or below the onCreate Method(within the class)

0

कोटलिन में:

val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
    // Handle the back button event
}

अधिक जानकारी के लिए आप यह देख सकते हैं ।

कोटलिन में बैक बटन को ओवरराइड करने के बारे में भी विशिष्ट प्रश्न है

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