0

Как предотвратить случайный выход приложения с Android?Как предотвратить случайный выход приложения с Android Fragments/Activities?

IE: Когда он нажимает кнопку «Назад» и достигает последнего действия в BackStack, покажите тост, чтобы спросить, хочет ли пользователь выйти с помощью метода onBackPressed().

Кроме того, ему необходимо работать с backStacks для фрагментов.

ответ

2

Эта функциональность может быть легко реализована путем переопределения метода onBackPressed() основной деятельности. В этом примере, когда пользователь нажимает кнопку «Назад», приложение будет отображать тост в течение 4 секунд, после чего новое обратное нажатие немедленно прекратит действие приложения.

ref

Вы можете поместить его в BaseActivity, который расширяет активность, как это:

public class BaseActivity extends Activity{ 

    private Toast toast; 
    private long lastBackPressTime = 0; 
    . . . 

    /** 
    * Prevent accidental app exit by requiring users to press back twice when 
    * the app is exiting w/in 4sec 
    */ 
    @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(); 
    } 
    } 
    . . . 
} 

EDIT: ADDED ФРАГМЕНТ BACKSTACK СОВМЕСТИМОСТЬ

Для использования обнаружения последнего фрагмента в приложение bacstack whos использует исключительно фрагменты, я настоятельно рекомендую положить ваш dispatchKeyEvents в класс BaseActivity и реализовать вышеупомянутый метод следующим образом:

public class BaseActivity extends Activity { 

    public boolean dispatchKeyEvent(KeyEvent event) { 
     int backCount = getFragmentManager().getBackStackEntryCount(); 
     int action = event.getAction(); 
     int keyCode = event.getKeyCode(); 

     FragmentManager fm = getFragmentManager(); 

    . . . 

     case KeyEvent.KEYCODE_BACK : 
       if (action == KeyEvent.ACTION_DOWN && backCount == 0) { 
        onexitNotify(); 
       }else { 
        fm.popBackStack(); 
       } 
       return true; 

      default : 
       return super.dispatchKeyEvent(event); 
     } 
    } 

/** 
* Prevent accidental app exit by requiring users to press back twice when 
* the app is exiting w/in 8sec 
*/ 
    private Toast toast; 
    private long lastBackPressTime = 0; 

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

* Если вы используете 2.0+, onBackPressed() упрощает объем кода, необходимый так OnKeyDown() не требуется.

Per узоры Androd Рекомендации для:

Некоторые приложения Запрашивать, когда он собирается выйти. Кажется, что будет особенно распространяться с игровыми приложениями. Эта практика не соответствует в обычных приложениях. Запрос подтверждения будет нарушить нормальный рабочий процесс пользователя. Даже в играх, использующих эту опцию, необходимо внимательно рассмотреть .

+0

'onBackpressed' был введен в API уровня 5, в то время как keydown был с API уровня 1. Кроме того, уровень API 5 - это Android 2.0. – Orlymee

0

Вы можете проверить, нажата ли клавиша «Назад» в основном действии вашего приложения. Затем вы можете показать пользователю alertdialog для подтверждения о выходе.

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    //Handle the back button 
    if(keyCode == KeyEvent.KEYCODE_BACK) {   
     checkExit();    
     return true; 
    }  
    else { 
     return super.onKeyDown(keyCode, event); 
    } 

} 

private void checkExit() 
{ 
    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) { 

        //take actions here accordingly as the user has pressed yes 
       } 
      }) 
      .setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      });  
    AlertDialog alert = builder.create(); 
    alert.show();  
} 
+0

Слишком много кода. onBackPressed() упрощает его. – CelticParser

+0

Это то же самое количество кода вместо использования нажатия. Я использую keydown. остальная часть предназначена для создания alertdialog. тосты могут быть пропущены в зависимости от вашей целевой аудитории. Alertdialog присутствует на экране, ожидая дальнейших действий. – Orlymee

+0

за рекомендацию по выбору Android: некоторые приложения запрашивают пользователя, когда он собирается выйти. Это, по-видимому, особенно распространено в игровых приложениях. Эта практика не рекомендуется в обычных приложениях. Запрос подтверждения приведет к нарушению нормального рабочего процесса пользователя. Даже в играх, использующих эту опцию, нужно очень тщательно учитывать. – CelticParser