2013-12-15 2 views
35

В моем приложении я хочу выйти из приложения при нажатии кнопки назад, это мой код: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(); 
    } 
+0

У вас нет ошибки компиляции этого кода? – LightYearsBehind

ответ

97

Когда вы нажмете назад, а затем закончите свою текущую деятельность (скажите A), вы увидите пустое действие с вашим логотипом приложения (скажем B), это просто означает, что активность 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); 

Теперь ваша деятельность а сверху на стек с другими видами деятельности вашего приложения на backstack.

В настоящее время в деятельности А где вы хотите реализовать 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 секунд, оно закрывает приложение.

+0

Я просто не знаю, что такое «NEXT_ACTIVITY» в моем приложении, я добавляю свой код в действие, что я хочу, чтобы кнопка выхода работала на этой странице, но в вашем коде я не знаю, на какой странице будет NEXT_ACTIVITY. –

+0

Спасибо! это сработало! – mboy

+0

Элегантный. Просто не уверен, что такое Home.this. Просто удалил его и оставил финиш(); – samleighton87

0

Вместо finish() вызова super.onBackPressed()

+0

@Shasika: то, что вы сказали, неверно, это не так, что вызывать один метод внутри него, я не могу вызвать onBackPressed() внутри него !!! –

5

Это означает предыдущую деятельность в стеке, когда вы начинаете эту деятельность. Добавьте finish(); после строки, в которой вы называете это действие.

В вашей предыдущей деятельности. при запуске нового вида деятельности -

startActivity(I); 

Добавить finish(); после этого.

1

Закончить не закрывает приложение, оно просто закрывает активность. Если это активность запуска, она закроет ваше приложение; если нет, он вернется к предыдущему действию.

Что вы можете сделать, это использовать onActivityResult, чтобы вызвать как можно больше финиша(), чтобы закрыть все открытые действия.

+0

, пожалуйста, проверьте Edit, я хочу, когда я закрою свое приложение он работает на заднем плане, как я могу это сделать? –

+0

@ElhamGdz вы можете перефразировать ваше предложение? Я не понимаю тебя. Если вы проверите жизненный цикл активности, то нет состояния, «работающего на фоне», оно работает или не работает. http://developer.android.com/training/basics/activity-lifecycle/index.html. Если вы хотите запустить какой-то код в фоновом режиме, вам может понадобиться Async или (как последний вариант) Service http://developer.android.com/reference/android/app/Service.html – gian1200

41

Попробуйте это:

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); 
+0

Это работает довольно хорошо для меня! Спасибо. –

+0

Спасибо! Он перезагружается без 'System.exit (0);' –

+0

Плохая практика, чтобы убить приложение с домашней кнопки и использовать System.exit (0); мы должны сохранить приложение для уничтожения системы после нажатия кнопки «Назад» в последнем действии –

-5

Используйте этот код очень простое решение

@Override 
    public void onBackPressed() { 
     super.onBackPressed(); // this line close the app on backpress 
} 
+3

. Какова цель переопределения какого-либо метода и вызова только супер-реализации? – pskink

+0

Неверный ответ. 'super.onBackPressed()' не будет покидать приложение, если это не будет основной деятельностью. Кроме того, почему переопределить, если вы ничего не делаете, кроме вызова 'super'? – Pang

1

Это одна работа для меня.Я нашел его сам, комбинируя другие ответы

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

У меня была такая же проблема, у меня есть один LoginActivity и один MainActivity. Если я нажму кнопку «Назад» в MainActivity, приложение должно закрыть. Я сделал это с помощью метода OnBackPressed. этот moveTaskToBack() работает так же, как и кнопка «Главная». Он оставляет стек Back так, как есть.

public void onBackPressed() { 
    // super.onBackPressed(); 
    moveTaskToBack(true); 

} 
+1

отлично! спасибо –

3

В моем понимании Google хочет, чтобы Android справлялся с управлением памятью и отключением приложений. Если вы должны выйти из приложения из кода, может быть полезно попросить Android запустить сборщик мусора.

@Override 
public void onBackPressed(){ 
    System.gc(); 
    System.exit(0); 
} 

Вы также можете добавить отделку() в коде, но это, вероятно, излишним, если вы делаете System.exit (0)

+0

приложение просто перезапускается после этого кодового блока –

1

кажется, никто не рекомендовал noHistory = «истина» в манифесте .xml, чтобы предотвратить появление определенной активности после нажатия кнопки, которая по умолчанию вызывает метод finish()

Смежные вопросы