होम बटन की तरह कार्य करने के लिए बैक बटन को ओवरराइड करें


253

बैक बटन दबाने पर, मैं अपने आवेदन को नष्ट स्थिति के बजाय रोकी हुई स्थिति में जाना चाहूंगा।

Android डॉक्स में यह कहा गया है:

... सभी गतिविधियों में व्यवहार नहीं होता है कि वे तब नष्ट हो जाते हैं जब BACK दबाया जाता है। जब उपयोगकर्ता संगीत अनुप्रयोग में संगीत बजाना शुरू करता है और फिर BACK दबाता है, तो एप्लिकेशन सामान्य बैक व्यवहार को ओवरराइड करता है, खिलाड़ी गतिविधि को नष्ट होने से रोकता है, और संगीत खेलना जारी रखता है, हालांकि इसकी गतिविधि अब दिखाई नहीं देती है

मैं अपने स्वयं के अनुप्रयोग में इस कार्यक्षमता को कैसे दोहराऊं?

मुझे लगता है कि तीन संभावनाएं होनी चाहिए ...

  1. बैक बटन प्रेस (नीचे के रूप में) पर कब्जा करें और फिर होम बटन कॉल को जो भी विधि (ओं) को कॉल करें।

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.d(this.getClass().getName(), "back button pressed");
        }
        return super.onKeyDown(keyCode, event);
    }
  2. बैक बटन प्रेस कैप्चर करें और फिर होम बटन प्रेस को स्पूफ करें।

  3. बैक बटन प्रेस पर कब्जा करें, फिर होम स्क्रीन की एक गतिविधि शुरू करें, प्रभावी रूप से मेरे आवेदन की गतिविधि को रोका स्थिति में डाल दें।

संपादित करें: मैं सेवाओं के बारे में जानता हूं और आवेदन में एक का उपयोग कर रहा हूं जिससे यह समस्या संबंधित है। यह प्रश्न विशेष रूप से बैक बटन दबाने पर नष्ट की गई स्थिति के बजाय गतिविधि को रोकी हुई अवस्था में रखने के बारे में है।


इसी तरह के एक उत्तर को देखें stackoverflow.com/questions/5914040/…
ज़ार ई अहमर

जवाबों:


338

ज्यादातर समय आपको पृष्ठभूमि में कुछ करने के लिए एक सेवा बनाने की आवश्यकता होती है , और आपका दृश्य Activityबस इसे नियंत्रित करता है Service। (मुझे यकीन है कि म्यूजिक प्लेयर उसी तरह से काम करता है, इसलिए डॉक्स में उदाहरण थोड़ा भ्रामक लगता है।) अगर ऐसा है, तो आप हमेशा की तरह और Activityकर सकते हैं finishService अभी भी चल रहा हो जाएगा।

एक सरल दृष्टिकोण Backबटन प्रेस पर कब्जा करने और कॉल को स्थानांतरित करने के लिए है TTTBBack (सच) निम्नानुसार है:

// 2.0 and above
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

// Before 2.0
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

मुझे लगता है कि पसंदीदा विकल्प एक गतिविधि के लिए होना चाहिए सामान्य रूप से समाप्त करने के लिए और यदि आवश्यक हो तो एक सेवा से वर्तमान स्थिति को पढ़ने के लिए खुद को फिर से बनाने में सक्षम होना चाहिए। परंतुmoveTaskToBack मौके पर एक त्वरित विकल्प के रूप में इस्तेमाल किया जा सकता है।

ध्यान दें : जैसा कि एंड्रॉइड 2.0 के नीचे डेव ने बताया था कि एक नई onBackPressedविधि शुरू की गई है , और बैक बटन को कैसे संभालना है , इन सिफारिशों पर।


1
MoveTaskToBack () वांछित के रूप में काम करता है। इस पद्धति का उपयोग करने के लिए डाउनसाइड क्या हो सकते हैं? क्या ऐसे मामले हैं जहां यह उम्मीद के मुताबिक काम नहीं कर सकता है?
bdls

1
इसके डॉक को अधिक ध्यान से पढ़ने के बाद, मुझे वास्तव में लगता है कि इसे ठीक काम करना चाहिए। (मैंने शुरू में सोचा था कि यह गतिविधि पर लागू होता है, लेकिन वास्तव में यह "इस गतिविधि से युक्त कार्य" कहता है।) लेकिन आपको इसे स्वयं के लिए परीक्षण करना चाहिए। :)
मिरको एन।

धन्यवाद Mirko, विधि अच्छी तरह से काम करने के लिए प्रकट होता है। यदि आप बाद में इस प्रश्न को देख रहे हैं तो यह आपके उत्तर के तल पर आपके संपादन को अधिक प्रमुखता देता है, तो यह अच्छा हो सकता है - जैसा कि मैं देख रहा था!
bdls

4
पिछली कुंजी को संभालने के लिए अनुशंसित तरीके के लिए कृपया android-developers.blogspot.com/2009/12/… पढ़ें ।
17

1
सिद्धांत में @bdls आपकी पृष्ठभूमि गतिविधि को सिस्टम द्वारा मारा जा सकता है यदि यह संसाधनों पर कम चलता है, इसलिए सुरक्षित होने के लिए इसे वैसे भी खुद को फिर से बनाने में सक्षम होना चाहिए। एंड्रॉइड म्यूजिक ऐप के सोर्स कोड पर मेरी नज़र थी और इसमें कोई विशेष बैक बटन हैंडलिंग नहीं दिख रही थी।
मिरको एन।

46

निम्नलिखित कोड का उपयोग करें:

public void onBackPressed() {    
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}

23

अगर आप Back Button को पकड़ना चाहते हैं तो Android Developer Blog पर इस पोस्ट को देखें । यह एंड्रॉइड 2.0 में ऐसा करने का आसान तरीका और 1.x और 2.0 पर चलने वाले एप्लिकेशन के लिए सबसे अच्छा तरीका है।

हालाँकि, यदि आपकी गतिविधि बंद हो जाती है, तब भी डिवाइस पर मेमोरी की उपलब्धता के आधार पर इसे मारा जा सकता है। यदि आप बिना UI के साथ चलने के लिए एक प्रक्रिया चाहते हैं तो आपको एक निर्माण करना चाहिए Serviceप्रलेखन सेवाओं के बारे में निम्नलिखित कहता है:

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

ये आपकी आवश्यकताओं के लिए उपयुक्त लगते हैं।


18

onBackPressed()android.app.Activity क्लास में परिभाषित शून्य को ओवरराइड करने का प्रयास करें ।


1
Android 2.0 के बाद से यह ओवरराइड करने के लिए सही बात है। developer.android.com/sdk/android-2.0.html
jay

14

अगर यह किसी और की मदद करता है, तो मेरे पास 2 लेआउट के साथ एक गतिविधि थी जिसे मैं विज़बिल्टी के लिए चालू और बंद करता था, एक तरह का पेज 1> पेज 2 संरचना का अनुकरण करने की कोशिश कर रहा था। अगर वे पेज 2 पर थे और बैक बटन दबाया था, तो मैं चाहता था कि वे पेज 1 पर वापस जाएं, अगर वे पेज 1 पर बैक बटन दबाते हैं तो यह अभी भी सामान्य रूप से काम करना चाहिए। इसका सुंदर बुनियादी लेकिन यह काम करता है

@Override
public void onBackPressed() {
// check if page 2 is open
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout);
    if(page2layout.getVisibility() == View.VISIBLE){
        togglePageLayout(); // my method to toggle the views
        return;
    }else{
        super.onBackPressed(); // allows standard use of backbutton for page 1
    }

}

आशा है कि यह किसी की मदद करता है, खुश है


10

काम करने का उदाहरण ..

सुनिश्चित करें कि सुपर कॉल न करें। BackPressed ();

@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);
}

इस तरह आपका बैक बटन होम बटन की तरह काम करता है। यह आपकी गतिविधि को पूरा नहीं करता है लेकिन इसे पृष्ठभूमि में ले जाता है

दूसरा रास्ता कॉल करने के लिए है moveTaskToBack(true);में onBackPressedऔर निकालने का ध्यान रखेंsuper.onBackPressed


0

इससे भी बेहतर, कैसे OnPause के बारे में () :

गतिविधि जीवनचक्र के हिस्से के रूप में कहा जाता है जब कोई गतिविधि पृष्ठभूमि में जा रही है, लेकिन अभी तक नहीं मारा गया है। OnResume () के लिए समकक्ष।

जब गतिविधि B को गतिविधि A के सामने लॉन्च किया जाता है, तो यह कॉलबैक A. B पर लागू किया जाएगा, जब तक A का ऑनपॉज़ () वापस नहीं आएगा, तब तक enter code hereयहां कुछ भी लंबा न करें।

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

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


0

Android 2.0 के बाद ओवरब्रैकड्रेस () को ओवरराइड करें। जैसे कि

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

0

मैंने उपरोक्त सभी समाधानों की कोशिश की है, लेकिन उनमें से किसी ने भी मेरे लिए काम नहीं किया। निम्नलिखित कोड ने मेरी मदद की, जब मेनऐक्टिविटी को इस तरह से लौटाने की कोशिश की कि ऑनक्रीट कहा जाता है:

Intent.FLAG_ACTIVITY_CLEAR_TOP कुंजी है।

  @Override
  public void onBackPressed() {
      Intent intent = new Intent(this, MainActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
  }

-1

मैं नए कस्टम EditText बनाया का उपयोग कर @Mirko एन उत्तरदाता का उपयोग किया है

 public class EditViewCustom extends EditText {

    Button cancelBtn;
    RelativeLayout titleReleLayout;
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public EditViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditViewCustom(Context context) {
        super(context);
    }

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){
        this.cancelBtn = cancelBtn;
        this.titleReleLayout = titleReleLayout;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            Log.d("KEYCODE_BACK","KEYCODE_BACK");
            cancelBtn.setVisibility(View.GONE);
            this.setFocusableInTouchMode(false);
            this.setFocusable(false);
            titleReleLayout.setVisibility(View.VISIBLE);

            return super.onKeyPreIme(keyCode, event);
          }

        return super.onKeyPreIme(keyCode, event);
    }

}

फिर अपनी गतिविधि से डेटा सेट करें

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

धन्यवाद।

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