Android: выход из приложения при нажатии кнопки возврата
В моем приложении я хочу выйти из приложения, когда нажимаю кнопку "Назад", этот мой код:
@Override
public void onBackPressed() {
new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Exit")
.setMessage("Are you sure you want to exit?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setNegativeButton("No", null).show();
}
он работает правильно, но когда я выхожу из приложения, он не выходит полностью и показывает пустую страницу с моим логотипом приложения, и когда я снова нажимаю кнопку выхода из приложения, как я могу ее исправить???
EDIT:
Я использую этот код вместо выше, но мое приложение полностью выходит, но я хочу, чтобы он работал на фоне и не полностью вышел, как я могу это сделать?
@Override
public void onBackPressed() {
new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Exit")
.setMessage("Are you sure?")
.setPositiveButton("yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
}
}).setNegativeButton("no", null).show();
}
Ответы
Ответ 1
Когда вы нажмете назад, а затем вы закончите свою текущую деятельность (скажите A), вы увидите пустое действие с логотипом вашего приложения (скажем B), это просто означает, что активность B, которая отображается после окончания A, все еще находится в задней части, а также активность A была начата с активности B, поэтому в активности вы должны начать активность A с флагами как
Intent launchNextActivity;
launchNextActivity = new Intent(B.class, A.class);
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(launchNextActivity);
Теперь ваша активность A находится сверху в стеке, при этом никакие другие действия вашего приложения не будут выполняться на задней панели.
Теперь в действии A, где вы хотите реализовать onBackPressed, чтобы закрыть приложение, вы можете сделать что-то вроде этого,
private Boolean exit = false;
@Override
public void onBackPressed() {
if (exit) {
finish(); // finish activity
} else {
Toast.makeText(this, "Press Back again to Exit.",
Toast.LENGTH_SHORT).show();
exit = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
exit = false;
}
}, 3 * 1000);
}
}
Обработчик здесь обрабатывает случайные обратные нажатия, он просто показывает Toast
, и если в течение 3 секунд имеется другое обратное нажатие, оно закрывает приложение.
Ответ 2
Попробуйте следующее:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//***Change Here***
startActivity(intent);
finish();
System.exit(0);
Ответ 3
У меня была одна и та же проблема: у меня есть одна LoginActivity и одна MainActivity.
Если я нажму кнопку "Назад" в MainActivity, приложение должно закрыть.
Я сделал это с помощью метода OnBackPressed. этот moveTaskToBack() работает так же, как и кнопка "Главная". Он оставляет стек Back, как есть.
public void onBackPressed() {
// super.onBackPressed();
moveTaskToBack(true);
}
Ответ 4
Это означает, что вы выполняли предыдущую операцию в стеке при запуске этой операции. Добавить finish();
после строки, в которой вы вызываете это действие.
В вашей предыдущей деятельности. когда вы начинаете новую деятельность, например -
startActivity(I);
Добавьте finish();
после этого.
Ответ 5
В моем понимании Google хочет, чтобы Android справлялся с управлением памятью и закрывал приложения. Если вы должны выйти из приложения из кода, может быть полезно попросить Android запустить сборщик мусора.
@Override
public void onBackPressed(){
System.gc();
System.exit(0);
}
Вы также можете добавить finish() в код, но это, вероятно, избыточно, если вы также используете System.exit(0)
Ответ 6
Finish не закрывает приложение, он просто закрывает активность. Если это активность запуска, она закроет ваше приложение; если нет, он вернется к предыдущему действию.
Что вы можете сделать, это использовать onActivityResult, чтобы вызвать как можно больше финиша(), чтобы закрыть все открытые действия.
Ответ 7
Эта работа для меня. Я нашел ее сам, объединив другие ответы
private Boolean exit = false;
@override
public void onBackPressed(){
if (exit) {
finish(); // finish activity
}
else {
Toast.makeText(this, "Press Back again to Exit.",
Toast.LENGTH_SHORT).show();
exit = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);
}
}, 1000);
}
Ответ 8
Кажется, никто не рекомендовал noHistory = "true" в manifest.xml, чтобы предотвратить появление определенной активности после нажатия кнопки возврата, которая по умолчанию вызывает метод finish()
Ответ 9
Вместо finish()
вызов super.onBackPressed()
Ответ 10
Используйте этот код очень простое решение
@Override
public void onBackPressed() {
super.onBackPressed(); // this line close the app on backpress
}