यह पुष्टि करने के लिए कि उपयोगकर्ता Android गतिविधि से बाहर निकलने की इच्छा कैसे करता है?


274

मैं "क्या आप बाहर निकलना चाहते हैं?" उपयोगकर्ता द्वारा किसी गतिविधि से बाहर निकलने का प्रयास करने पर संवाद का प्रकार।

हालाँकि मुझे उपयुक्त API हुक नहीं मिल रहे हैं। Activity.onUserLeaveHint()शुरू में होनहार दिखे, लेकिन मुझे गतिविधि को खत्म करने से रोकने का कोई तरीका नहीं मिला।


39
क्या यह बिल्कुल जरूरी है कि आपके पास यह संकेत है? जब कोई उपयोगकर्ता किसी गतिविधि को समाप्त करना चाहता है, तो उन्हें तुरंत ऐसा करने में सक्षम होना चाहिए। आप अपनी रणनीति पर पुनर्विचार करना चाहते हैं।
टॉम आर

4
सैमसंग के ऐप स्टोर पर लिस्टिंग के लिए एग्जिट कन्फर्मेशन विकल्प दिखाना अनिवार्य है। मेरे एक ऐप को ऐसा न करने के लिए खारिज कर दिया गया था।
जॉन एशमोर

6
यह अप्रिय है, @ सैमसंग।
dokkaebi

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

15
@ टॉम आर: पूरी तरह से असहमत हैं। ऐसे ऐप हैं जिन्हें आप दुर्घटना से खत्म नहीं करना चाहते हैं। वे व्यवसाय के माहौल आदि में काम करते हैं।
TomeeNS

जवाबों:


390

Android 2.0+ में ऐसा दिखेगा:

@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle("Closing Activity")
        .setMessage("Are you sure you want to close this activity?")
        .setPositiveButton("Yes", new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();    
        }

    })
    .setNegativeButton("No", null)
    .show();
}

पहले के संस्करणों में ऐसा दिखेगा:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    //Handle the back button
    if(keyCode == KeyEvent.KEYCODE_BACK) {
        //Ask the user if they want to quit
        new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle(R.string.quit)
        .setMessage(R.string.really_quit)
        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                //Stop the activity
                YourClass.this.finish();    
            }

        })
        .setNegativeButton(R.string.no, null)
        .show();

        return true;
    }
    else {
        return super.onKeyDown(keyCode, event);
    }

}

15
इसके अलावा 2.0 और इसके बाद के संस्करण में एक नया onBackPressed इवेंट है, जिसे onKeyDown developer.android.com/intl/zh-TW/reference/android/app/ पर अनुशंसित किया गया है। यहां एक खंड है जो परिवर्तनों और नए अनुशंसित दृष्टिकोण के बारे में बात कर रहा है। developer.android.com/intl/zh-TW/sdk/android-2.0.html
पैट्रिक काफ्का

3
पीछे की कुंजी पकड़ने पर ब्लॉग पोस्ट: android-developers.blogspot.com/2009/12/… ध्यान दें कि यह आपको अन्य तरीकों से पकड़ने की अनुमति नहीं देता है उपयोगकर्ता आपके ऐप को छोड़ सकते हैं: घर पर दबाव डालना, अधिसूचना का चयन करना, फोन प्राप्त करना कॉल, आदि
हैकबॉड 19

यह पूरी तरह से काम करता है लेकिन उपयोगकर्ता को दिखाए जाने के दौरान आप कोड निष्पादन को कैसे रोक सकते हैं?
अनोन 58192932

यह पाया, यह यहाँ एक महान समाधान है: stackoverflow.com/questions/4381296/…
anon58192932

1
यह वह विधि है () जो मैं देख रहा हूं, लेकिन मुझे नहीं पता था कि इस पद्धति को कहां बुलाया जाए ()।
user2841300

186
@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
           .setMessage("Are you sure you want to exit?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   ExampleActivity.super.onBackPressed();
               }
           })
           .setNegativeButton("No", null)
           .show();
}

5
एल्डरफोर्ड द्वारा एक टिप्पणी की गई: सुपर ऑनबैकपेड को कॉल करना ऑनबैक मानने से बेहतर है कि बैकप्रेस्ड केवल कॉल फिनिश () होगा। यहां तक ​​कि अगर यह अब सच है, तो यह भविष्य के एपीआई में सच नहीं हो सकता हैCustomTabActivity.super.onBackPressed
mplungjan

@mplungjan क्या आप अपनी टिप्पणी स्पष्ट कर सकते हैं ... क्या आप कह रहे हैं कि finish()कोड को बदलना बेहतर है super.onBackPressed()?
प्रतिबंध-जियोइंजीनियरिंग

टिप्पणी 3 साल पुरानी है। मुझे नहीं पता कि 2015 में अच्छा अभ्यास क्या है
mplungjan

@mplungjan आपकी टिप्पणी भविष्य के API को संदर्भित करती है, लेकिन यदि आप किसी भी तरह से स्पष्ट कर सकते हैं तो यह उपयोगी होगा।
प्रतिबंध-जियोइंजीनियरिंग

समस्या नहीं। खैर, मैंने अभी कोशिश की है MyActivity.super.onBackPressed();और यह मेरे लिए ठीक है। यह सबसे तार्किक दृष्टिकोण के लिए भी प्रतीत होता है - यदि आप उपयोगकर्ता के नंबर को टैप करते समय मानक व्यवहार चाहते हैं तो आप जिस विधि को ओवरराइड कर रहे हैं उसे कॉल करने के लिए। "
प्रतिबंध-जियोइंजीनियरिंग

33

@ User919216 कोड को संशोधित किया है .. और इसे WebView के साथ संगत बनाया है

@Override
public void onBackPressed() {
    if (webview.canGoBack()) {
        webview.goBack();

    }
    else
    {
     AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
       .setCancelable(false)
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                finish();
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
AlertDialog alert = builder.create();
alert.show();
    }

}

22

मैं बाहर निकलने वाले डायलॉग की तुलना में बैक बटन पर डबल टैप से बाहर निकलना पसंद करूंगा।

इस समाधान में, यह पहली बार वापस जाने पर एक टोस्ट दिखाता है, चेतावनी देता है कि एक और बैक प्रेस ऐप को बंद कर देगा। इस उदाहरण में 4 सेकंड से कम है।

private Toast toast;
private long lastBackPressTime = 0;

@Override
public void onBackPressed() {
  if (this.lastBackPressTime < System.currentTimeMillis() - 4000) {
    toast = Toast.makeText(this, "Press back again to close this app", 4000);
    toast.show();
    this.lastBackPressTime = System.currentTimeMillis();
  } else {
    if (toast != null) {
    toast.cancel();
  }
  super.onBackPressed();
 }
}

टोकन से: http://www.androiduipatterns.com/2011/03/back-button-behavior.html


यह निश्चित रूप से मेरा पसंदीदा है क्योंकि डायलॉगबॉक्स बोझिल हो सकता है। मैंने इसे 3 सेकंड करने के लिए थोड़ा बदल दिया और यह उस मार्कर के साथ थोड़ा अधिक स्वाभाविक लगता है। पोस्ट के लिए धन्यवाद।
PGMacDesign

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

21

यदि आप निश्चित नहीं हैं कि "बैक" पर कॉल ऐप से बाहर निकलेगी, या उपयोगकर्ता को किसी अन्य गतिविधि में ले जाएगी, तो आप उपरोक्त उत्तरों को एक चेक, isTaskRoot () में लपेट सकते हैं। यह तब हो सकता है जब आपकी मुख्य गतिविधि को कई बार बैक स्टैक में जोड़ा जा सकता है, या यदि आप अपने बैक स्टैक इतिहास में हेरफेर कर रहे हैं।

if(isTaskRoot()) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure you want to exit?")
       .setCancelable(false)
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                YourActivity.super.onBackPressed;
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
           }
       });
    AlertDialog alert = builder.create();
    alert.show();

} else {
    super.onBackPressed();
}

5

लैम्ब्डा का उपयोग करना:

    new AlertDialog.Builder(this).setMessage(getString(R.string.exit_msg))
        .setTitle(getString(R.string.info))
        .setPositiveButton(getString(R.string.yes), (arg0, arg1) -> {
            moveTaskToBack(true);
            finish();
        })
        .setNegativeButton(getString(R.string.no), (arg0, arg1) -> {
        })
        .show();

आपको अपने gradle.build में जावा 8 का समर्थन करने के लिए स्तरीय भाषा सेट करने की आवश्यकता है:

compileOptions {
       targetCompatibility 1.8
       sourceCompatibility 1.8
}

5

चीन में, अधिकांश ऐप "दो बार क्लिक करें" द्वारा बाहर निकलने की पुष्टि करेंगे:

boolean doubleBackToExitPressedOnce = false;

@Override
public void onBackPressed() {
    if (doubleBackToExitPressedOnce) {
        super.onBackPressed();
        return;
    }

    this.doubleBackToExitPressedOnce = true;
    Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            doubleBackToExitPressedOnce=false;                       
        }
    }, 2000);
} 

5

पहले से और नीचे कोड super.onBackPressed();से onbackPressed()विधि को हटा दें :

@Override
public void onBackPressed() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure you want to exit?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    MyActivity.this.finish();
               }
           })
           .setNegativeButton("No", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
               }
           });
    AlertDialog alert = builder.create();
    alert.show();

}

2

मुझे एक @ योगी दृष्टिकोण पसंद है और नीचे की तरह टुकड़े के साथ इसका उपयोग कर रहा हूं।

@Override
public void onBackPressed() {
    if(isTaskRoot()) {
        new ExitDialogFragment().show(getSupportFragmentManager(), null);
    } else {
        super.onBackPressed();
    }
}

खुशबू का उपयोग कर संवाद:

public class ExitDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
            .setTitle(R.string.exit_question)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    getActivity().finish();
                }
            })
            .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    getDialog().cancel();
                }
            })
            .create();
    }
}

2
Just put this code in your first activity 

@Override
    public void onBackPressed() {
        if (drawerLayout.isDrawerOpen(GravityCompat.END)) {
            drawerLayout.closeDrawer(GravityCompat.END);
        }
        else {
// if your using fragment then you can do this way
            int fragments = getSupportFragmentManager().getBackStackEntryCount();
            if (fragments == 1) {
new AlertDialog.Builder(this)
           .setMessage("Are you sure you want to exit?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    finish();
               }
           })
           .setNegativeButton("No", null)
           .show();


            } else {
                if (getFragmentManager().getBackStackEntryCount() > 1) {
                    getFragmentManager().popBackStack();
                } else {

           super.onBackPressed();
                }
            }
        }
    }

y पहली गतिविधि, इसे बीच में गतिविधि में नहीं डाल सकता। क्योंकि अब यह
jsut

1

एक अन्य विकल्प के लिए होगा एक दिखाने Toast/ Snackbarपहले वापस प्रेस से बाहर निकलें करने के लिए फिर से वापस प्रेस करने के लिए कहा पर है, जो एक बहुत कम एक दिखा तुलना में घुसपैठ AlertDialogउपयोगकर्ता अनुप्रयोग से बाहर करना चाहता है की पुष्टि करने के लिए।

आप DoubleBackPress Android Libraryकोड की कुछ पंक्तियों के साथ इसे प्राप्त करने के लिए उपयोग कर सकते हैं । उदाहरण समान व्यवहार दिखाने वाला GIF।

शुरू करने के लिए, अपने आवेदन में निर्भरता जोड़ें:

dependencies {
    implementation 'com.github.kaushikthedeveloper:double-back-press:0.0.1'
}

अगला, अपनी गतिविधि में, आवश्यक व्यवहार लागू करें।

// set the Toast to be shown on FirstBackPress (ToastDisplay - builtin template)
// can be replaced by custom action (new FirstBackPressAction{...})
FirstBackPressAction firstBackPressAction = new ToastDisplay().standard(this);

// set the Action on DoubleBackPress
DoubleBackPressAction doubleBackPressAction = new DoubleBackPressAction() {
    @Override
    public void actionCall() {
        // TODO : Exit the application
        finish();
        System.exit(0);
    }
};

// setup DoubleBackPress behaviour : close the current Activity
DoubleBackPress doubleBackPress = new DoubleBackPress()
        .withDoublePressDuration(3000)     // msec - wait for second back press
        .withFirstBackPressAction(firstBackPressAction)
        .withDoubleBackPressAction(doubleBackPressAction);

अंत में, इसे बैक प्रेस पर व्यवहार के रूप में सेट करें।

@Override
public void onBackPressed() {
    doubleBackPress.onBackPressed();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.