안드로이드에서 2회 연속 백버튼을 눌러서 앱을 종료시키는 경우가 흔한데, 이 기능은 많이 사용되므로 다음과 같이 별도 클래스로 기능을 분리하면 향후 기능 재사용이 편리하다.
public class BackPressCloseHandler {
private long backKeyPressedTime = 0;
private Toast toast;
private Activity activity;
public BackPressCloseHandler(Activity context) {
this.activity = context;
}
public void onBackPressed() {
if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
backKeyPressedTime = System.currentTimeMillis();
showGuide();
return;
}
if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
activity.finish();
toast.cancel();
}
}
private void showGuide() {
toast = Toast.makeText(activity, "\'뒤로\'버튼을 한번 더 누르시면 종료됩니다.",
Toast.LENGTH_SHORT);
toast.show();
}
}
BackPressCloseHandler의 구현은 간단하다.
- backKeyPressedTime은 백버튼이 눌린 마지막 시간을 기록한다.
- onBackPressed() 메서드는 현재 시간이 마지막 백버튼 누른 시간으로부터
- 2초 이상 지났으면, 마지막 백버튼 눌린 시간을 현재 시간으로 갱신하고 showGuide()를 실행한다.
- 2초 이상 지나지 않았으면, Activity를 종료한다.
- 참고로, 2초는 Toast.LENGTH_SHORT의 기본 값이다.
- showGuide() 메서드는 Toast를 이용해서 메시지를 출력한다.
2회 연속 백버튼 누를 때 종료시키고 싶은 Activity가 있다면, 다음과 같이 사용한다.
- BackPressCloseHandler 타입의 backPressCloseHandler 필드를 추가한다.
- onCreate() 메서드에서 BackPressCloseHandler 객체를 생성해서 필드에 할당한다.
- onBackPressed() 메서드에서 backPressCloseHandler.onBackPressed()를 호출한다.
public class HomeActivity extends Activity ... {
private BackPressCloseHandler backPressCloseHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home_layout);
...
backPressCloseHandler = new BackPressCloseHandler(this);
}
@Override
public void onBackPressed() {
backPressCloseHandler.onBackPressed();
}
}