기기의 뒤로 가기 버튼을 눌렀을 때 발생하는 이벤트를 제어해보자.
안드로이드 기기라면 모두 갖고 있는 위 버튼이다.
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()와 마찬가지로 잘 작동한다.
단순히 액티비티 종료의 개념이 아닌, 레이아웃 변경 등
시스템 뒤로가기 버튼을 활용할 곳이 은근 많다고 느낀다.
'Android (안드로이드)' 카테고리의 다른 글
[Android] 화면 전환 애니메이션 효과 / 액티비티 전환 애니메이션 효과 / overridePendingTransition / overrideActivityTransition (2) | 2024.06.07 |
---|---|
[Android] strings.xml / colors.xml / string · color 파일 참조 (0) | 2024.03.11 |
[Android] Google AdMob / 앱에 광고 붙이기 / 배너 광고 (2) | 2024.03.07 |
[Android] PaintFlag / SpannableString / 텍스트에 줄 긋기 / 밑줄 · 취소선 긋기 / 일부분만 적용 (0) | 2024.03.01 |
[Android] Hilt / 힐트 / 예제 / 의존성 주입 라이브러리 (0) | 2024.02.25 |