ABOUT ME

dddd-

Today
-
Yesterday
-
Total
-
  • [뒤로가기 두번 눌러 종료] 안드로이드 뒤로가기 두번 눌러서 종료하기
    Android/개발 2018. 10. 26. 21:39


    안드로이드 뒤로가기 두 번 눌러서 앱 종료하기




    안드로이드는 안드로이드만의 특징 중 하나인 뒤로가기 버튼을 이용하여 앱을 종료할 수 있습니다.

    앱을 종료하고 싶으면 간편하게 뒤로가기를 누르면 되죠. 하지만 사용자가 잘못 눌렀는데 앱이 종료된다면 사용자에게는 좋지않은 UX가 될 것입니다. 그래서 예전에는 종료 다이얼로그를 띄워 종료를 확인하는 방법을 많이 썼지만 요즘은 뒤로가기를 한 번 누르면 Toast 메세지가 나오고 한 번 더 누르면 앱이 종료되는 방식을 많이 사용합니다.

    그래서 뒤로가기를 두 번 눌렀을때 앱이 종료되는 방법을 알아보도록 하겠습니다!






    구현 방법은 변수 하나, 객체 하나 그리고 Override함수인 onBackPressed() 함수에 소스코드 5~6줄만 추가시켜주면 됩니다.


    1. 변수와 객체 선언

    // 마지막으로 뒤로가기 버튼을 눌렀던 시간 저장
    private long backKeyPressedTime = 0;
    // 첫 번째 뒤로가기 버튼을 누를때 표시
    private Toast toast;


    - 위 변수와 객체의 용도는 밑에서 설명하겠습니다.






    2. onBackPressed() 함수

    @Override
    public void onBackPressed() {
    // 기존 뒤로가기 버튼의 기능을 막기위해 주석처리 또는 삭제
    // super.onBackPressed();

    // 마지막으로 뒤로가기 버튼을 눌렀던 시간에 2초를 더해 현재시간과 비교 후
    // 마지막으로 뒤로가기 버튼을 눌렀던 시간이 2초가 지났으면 Toast Show
    // 2000 milliseconds = 2 seconds
    if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
    backKeyPressedTime = System.currentTimeMillis();
    toast = Toast.makeText(this, "\'뒤로\' 버튼을 한번 더 누르시면 종료됩니다.", Toast.LENGTH_SHORT);
    toast.show();
    return;
    }
    // 마지막으로 뒤로가기 버튼을 눌렀던 시간에 2초를 더해 현재시간과 비교 후
    // 마지막으로 뒤로가기 버튼을 눌렀던 시간이 2초가 지나지 않았으면 종료
    // 현재 표시된 Toast 취소
    if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
    finish();
    toast.cancel();
    }
    }


    - 끝입니다! 간단하죠?

      이렇게만 사용하셔도 되지만 자주 쓰는게 아닌 것들은 바로 구현하려면 생각이 안날때가 있죠.

      그래서 저는 BackPressHandler라는 클래스를 하나 만들어 각각의 프로젝트마다 적용합니다.


      // 바쁘신 분들은 여기까지만 읽으셔도 됩니다.

      




    3. BackPressHandler.java

    package com.imaec.forblog;

    import android.app.Activity;
    import android.widget.Toast;

    /**
    * Created by imaec on 2018-10-26.
    */

    public class BackPressHandler {

    // 마지막으로 뒤로가기 버튼을 눌렀던 시간 저장
    private long backKeyPressedTime = 0;
    // 첫 번째 뒤로가기 버튼을 누를때 표시
    private Toast toast;
    // 종료시킬 Activity
    private Activity activity;

    /**
    * 생성자
    * @param activity 종료시킬 Activity.
    */
    public BackPressHandler(Activity activity) {
    this.activity = activity;
    }

    /**
    * Default onBackPressed()
    * 2 seconds
    */
    public void onBackPressed() {
    if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
    backKeyPressedTime = System.currentTimeMillis();
    showGuide();
    return;
    }
    if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
    activity.finish();
    toast.cancel();
    }
    }

    /**
    * Toast 메세지 사용자 지정 onBackPressed(String msg)
    * @param msg Toast makeText()의 2번째 인자에 들어갈 text
    */
    public void onBackPressed(String msg) {
    if (System.currentTimeMillis() > backKeyPressedTime + 2000) {
    backKeyPressedTime = System.currentTimeMillis();
    showGuide(msg);
    return;
    }
    if (System.currentTimeMillis() <= backKeyPressedTime + 2000) {
    activity.finish();
    toast.cancel();
    }
    }

    /**
    * 뒤로가기 간격 사용자 지정 onBackPressed(int time)
    * @param time 첫 번째 뒤로가기와 두 번째 뒤로가기 사이 간격, milliseconds 단위
    */
    public void onBackPressed(int time) {
    if (System.currentTimeMillis() > backKeyPressedTime + time) {
    backKeyPressedTime = System.currentTimeMillis();
    showGuide();
    return;
    }
    if (System.currentTimeMillis() <= backKeyPressedTime + time) {
    activity.finish();
    toast.cancel();
    }
    }

    /**
    * Toast 메세지 사용자 지정, 뒤로가기 간격 사용자 지정
    * onBackPressed(String msg, int time)
    * @param msg Toast makeText()의 2번째 인자에 들어갈 text
    * @param time 첫 번째 뒤로가기와 두 번째 뒤로가기 사이 간격, milliseconds 단위
    */
    public void onBackPressed(String msg, int time) {
    if (System.currentTimeMillis() > backKeyPressedTime + time) {
    backKeyPressedTime = System.currentTimeMillis();
    showGuide(msg);
    return;
    }
    if (System.currentTimeMillis() <= backKeyPressedTime + time) {
    activity.finish();
    toast.cancel();
    }
    }

    /**
    * Default showGuide()
    */
    private void showGuide() {
    toast = Toast.makeText(activity, "\'뒤로\' 버튼을 한번 더 누르시면 종료됩니다.", Toast.LENGTH_SHORT);
    toast.show();
    }

    /**
    * Toast 메세지 사용자 지정 showGuide(String msg)
    * @param msg Toast makeText()의 2번째 인자에 들어갈 text
    */
    private void showGuide(String msg) {
    toast = Toast.makeText(activity, msg, Toast.LENGTH_SHORT);
    toast.show();
    }
    }


    - onBackPressed() 함수가 4개 있지만 필요한 것을 가져다 사용하시면 됩니다.






    4. MainActivity.java // BackPressHandler 사용

    package com.imaec.forblog;

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;

    public class MainActivity extends AppCompatActivity {

    // BackPressHandler 객체 선언, 할당
    private BackPressHandler backPressHandler = new BackPressHandler(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }

    @Override
    public void onBackPressed() {
    // Default
    backPressHandler.onBackPressed();
    // Toast 메세지 사용자 지정
    backPressHandler.onBackPressed("뒤로가기 버튼 한번 더 누르면 종료");
    // 뒤로가기 간격 사용자 지정
    backPressHandler.onBackPressed(3000);
    // Toast, 간격 사용자 지정
    backPressHandler.onBackPressed("뒤로가기 버튼 한번 더 누르면 종료", 3000);
    }
    }


    - Override된 onBackPressed() 함수에는 4가지 중 하나의 backPressHandler.onBackPressed() 함수를 사용하시면 됩니다.





    - 이상 뒤로가기 두 번 눌러서 앱 종료하는 방법을 알아봤습니다!

      모두 경험치 많이 쌓아서 안드로이드 고수가 됩시다!





    댓글

Designed by Tistory.