[Android] 뒤로가기 버튼 두 번 눌렀을 때 앱 종료하기

By | 12월 29, 2020
  • 인터넷에 널린 유사한 글들을 살짝 수정함.

     

    * 뒤로가기 핸들러 정의

    package and.bruce.com.handler;
    import android.app.Activity;
    import android.content.pm.ApplicationInfo;
    import android.support.v4.app.ActivityCompat;
    import android.widget.Toast;
    import and.bruce.com.App;
    /**
    * 뒤로가기 버튼을 두 번 눌렀을 때 앱을 종료하게 하는 핸들러
    */
    public class BackPressCloseHandler {
    private long backKeyPressedTime = 0;
    private static final long checkInterval = 2000;
    private Toast toast;
    private Activity activity;
    private final static int appFlags = App.getAppContext().getApplicationInfo().flags;
    private final static boolean isDebug = (appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
    public BackPressCloseHandler(Activity context) {
        this.activity = context;
    }
    public void onBackPressed() {
        if (System.currentTimeMillis() > backKeyPressedTime + checkInterval) {
            backKeyPressedTime = System.currentTimeMillis();
            showGuide();
            return;
        }
        if (System.currentTimeMillis() <= backKeyPressedTime + checkInterval) {
            toast.cancel();
            off();
        }
    }
    /**
     * 앱 종료
     */
    public void off(){
        // 어느 Activity 에서든 모든 부모 Activity를 닫을 수 잇다.
        ActivityCompat.finishAffinity(activity);
        // 디버그모드가 아닐 경우에만 사용하자 (TODO: 실제로 이 분기가 적용되는지 테스트 해 보자)
        if(! isDebug){
            System.exit(0); // 혹은 android.os.Process.killProcess(android.os.Process.myPid()); 사용
        }
    }
    /**
     * 뒤로가기 종료 전 안내
     */
    public void showGuide() {
        toast = Toast.makeText(activity, "\'뒤로\'버튼을 한번 더 누르시면 종료됩니다.", Toast.LENGTH_SHORT);
        toast.show();
    }
    }
    

     

    * Activity 클래스의 onCreate() 내에서 초기화

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        // 뒤로가기 버튼 종료 관련 핸들러
        backPressCloseHandler = new BackPressCloseHandler(this);
        ...
    }
    

     

    * Activity 클래스에 정의된 이벤트핸들러

        /**
     * 뒤로가기 버튼이 눌렸을 때 최초로 호출되는 메서드
     */
    @Override
    public void onBackPressed() {
        // Navigation Drawer가 열려 있을 경우 닫는다.
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        // Navigation Drawer가 닫혀 있을 경우
        } else {
            backPressCloseHandler.onBackPressed();
        }
    }
    

     

     

     

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments