Android (안드로이드)

[Android] onBackPressed / OnBackPressedDispatcher / 기기 · 시스템 뒤로가기 버튼 / 두 번 눌러서 뒤로가기

Oscar:) 2024. 3. 11. 00:48

 

 

 

기기의 뒤로 가기 버튼을 눌렀을 때 발생하는 이벤트를 제어해보자.

 

 

 

 

안드로이드 기기라면 모두 갖고 있는 위 버튼이다.

 

 


 

onBackPressed

 

 

기본적으로 액티비티는 AppCompatActivity를 상속하기에,

다음과 같이 onBackPressed() 메서드를 @Override하여 사용할  수 있다.

@Override
public void onBackPressed() {
    super.onBackPressed();
}

 

위 코드만 작성하고 실행해보면 달라진 것이 없을 것이다.

 

 

super.onBackPressed()를 지워주고,

작업을 추가해보자.

@Override
public void onBackPressed() {
    Toast.makeText(this, "한 번 더 누르면 종료됩니다.", Toast.LENGTH_SHORT).show();
}

 

 

결과)

 

시스템 뒤로가기 버튼을 눌러도 앱이 종료되지 않고

토스트 메세지를 띄웠다.

 

 

 

하지만 위 상태로 놔두면 뒤로가기 버튼을 통해 앱을 종료할 수 없다.

 

아래 코드를 작성해주자.

long backPressedTime = 0;

@Override
public void onBackPressed() {

    if (System.currentTimeMillis() - backPressedTime >= 2000) {

        backPressedTime = System.currentTimeMillis();
        Toast.makeText(this, "한 번 더 누르면 종료됩니다.", Toast.LENGTH_SHORT).show();

    } else {

        finish();

    }
    
}

 

뒤로가기 버튼을 누른 시각을 저장할 backPressedTime 변수를 초기화 해주고,

2초 이내에 2번 누르면 종료되도록 간단한 로직을 만들어준다.

 

 

결과)

 

 


 

onBackPressedDispatcher

 

 

onBackPressed() 메서드가 targetSDK 33부터 Deprecated 되었다.

 

물론 그 이전 SDK에서는 아직 사용에 문제가 없지만,

Google에서는 현재 targetSDK 33을 최소 출시 기준으로 잡고 있다.

 

 

결론적으로, onBackPressed() 메서드는 더 이상 사용하지 말라는 뜻이다.

 

 

 

대체 방안으로 OnBackPressedDispatcher를 사용할 수 있다.

 

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    setBackPressed()
}
    

public void setBackPressed() {

    OnBackPressedCallback callback = new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {

            if (System.currentTimeMillis() - backPressedTime >= 2000) {
                backPressedTime = System.currentTimeMillis();
                Toast.makeText(BackActivity.this, "한 번 더 누르면 종료됩니다^^", Toast.LENGTH_SHORT).show();
            } else {
                finish();
            }

        }
    };

    this.getOnBackPressedDispatcher().addCallback(this, callback);

}

 

 

OnBackPressedCallback 객체에 뒤로가기 버튼 클릭 시 동작을 초기화 해주고,

onBackPressedDispatcher에 추가해주는 구조다.

 

 

위 과정을 하나의 메서드에 묶어주고 onCreate()에서 호출해 주었다.

 

 

 

결과)

 

onBackPressed()와 마찬가지로 잘 작동한다.

 

 

 


 

 

 

단순히 액티비티 종료의 개념이 아닌, 레이아웃 변경 등

시스템 뒤로가기 버튼을 활용할 곳이 은근 많다고 느낀다.