问题
The situation could be like say, I've 5 activities. Say Main activity, Activity 1, Activity 2, Activity 3 and Activity 4.
One can use the Activity 1,2,3 & 4 directly with the help of buttons so inserted on Main Activity layout.
Situation: User enters into the Main Activity, and presses a button to enter into Activity 2. Then he back presses and comes back to Main Activity. from there he now enters Activity 3 with the help of another button and similarly when he presses back button he enters into Main Activity.
Main Activity --> Activity 2 --> Main Activity --> Activity 3 --> Main Activity.
Problem: Now as the user enters from Activity 3 to Main Activity. The user is on Main Activity layout. And now if the user presses the back button on its phone, then it will take the following process to exit the app:
Main Activity --> Activity 3 --> Main Activity --> Activity 2 --> Main Activity --> EXIT
Needs to be done: I want to exit the app from the Main Activity itself, if the user presses the back button on its phone, then instead of following the above path to exit the app, I want that the user should be able to exit it from the Main Activity itself by displaying a simple AlertDialog box.
How could that be done, as I'm unable to find a solution to this problem?
回答1:
You need to Override onBackPressed()
inside your MainActivity()
and use finishAffinity
to finish all activities
onBackPressed()
Called when the activity has detected the user's press of the back key.
finishAffinity() :
added in API level 16
Finish this activity as well as all activities immediately below it in the current task that have the same affinity.
SAMPLE CODE
@Override
public void onBackPressed() {
super.onBackPressed();
ActivityCompat.finishAffinity(MainActivity.this);
}
EDIT
I want that the user should be able to exit it from the Main Activity itself by displaying a simple AlertDialog box.
@Override
public void onBackPressed() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
.setTitle("Alert")
.setCancelable(false)
.setMessage("Are your sure want to exit?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.finishAffinity(MainActivity.this);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.show();
}
回答2:
add your MainActivity
@Override
public void onBackPressed() {
finish();
super.onBackPressed();
}
回答3:
It is a good code practice to write double back press to exit Main Activity.
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);
}
回答4:
this is commonly used way to exit the app, also i recommend using "nohistory" attribute in manifest for activities other than MainActivity.
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);
}
and for other activities use nohistory method in manifest
<activity
android:name="com.omniapay.salesservice.Activities.LoginActivity"
android:label="LOGIN"
android:noHistory="true" />
来源:https://stackoverflow.com/questions/50245631/how-to-exit-the-android-application-on-backpress