Android Predictive Back 적용하기
Android Predictive Back 적용하기 - 기존 onBackPressed() 코드에서 무엇을 수정해야 할까?
Android SDK를 35에서 36으로 마이그레이션하면서 가장 먼저 확인했던 항목 중 하나가 바로 Predictive Back이었다.
처음에는 Android 16(API 36)에서 새롭게 추가된 기능이라고 생각했지만, 실제로는 Android 13(API 33)부터 도입된 기능이다.
다만 SDK를 최신 버전으로 올리면서 기존 Back 버튼 처리 방식과 충돌하는 코드가 없는지 반드시 확인해야 한다.
이번 글에서는 Predictive Back이 무엇인지, 기존 프로젝트에서 어떤 부분을 수정해야 하는지, 그리고 실제 프로젝트에서는 어떻게 대응했는지 정리해 보려고 한다.
Predictive Back이란?
Predictive Back은 사용자가 뒤로 가기 제스처를 수행하는 동안 다음 화면으로 어떻게 이동할지 미리 보여주는 시스템 애니메이션이다.
기존에는 뒤로 가기 버튼이나 제스처를 수행하면 즉시 이전 화면으로 이동했다.
하지만 Predictive Back에서는 사용자가 화면 가장자리에서 스와이프하는 순간부터 이전 화면이 미리 보이기 시작한다.
덕분에 사용자는 뒤로 가기를 수행하기 전에 어떤 화면으로 이동하는지 확인할 수 있다.
왜 기존 코드가 문제가 될 수 있을까?
예전 Android 프로젝트에서는 대부분 다음과 같은 방식으로 Back 버튼을 처리했다.
@Override
public void onBackPressed() {
finish();
}또는
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}이 방식은 오랫동안 사용되어 왔지만 Predictive Back 시스템과는 잘 맞지 않는다.
특히
- KEYCODE_BACK 직접 처리
- onBackPressed() 오버라이드
- 커스텀 Back Stack
을 사용하는 프로젝트는 반드시 동작을 다시 확인해야 한다.
Predictive Back은 언제부터 적용되었을까?
버전별로 정리하면 다음과 같다.
Android 버전 | 내용 |
|---|---|
Android 13 (API 33) | Predictive Back 도입 |
Android 14 (API 34) | 기능 확대 |
Android 15 (API 35) | 안정화 |
Android 16 (API 36) | 최신 Back 동작 유지 |
즉, SDK 36에서 새롭게 생긴 기능은 아니지만, SDK를 올리는 시점에 기존 코드를 함께 정리하는 것이 좋다.
권장되는 Back 처리 방식
현재 AndroidX에서는 OnBackPressedDispatcher 사용을 권장한다.
예를 들어 Activity에서는 다음과 같이 구현할 수 있다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
registerBackPressedCallback();
...
}
private void registerBackPressedCallback() {
getOnBackPressedDispatcher().addCallback(
this,
new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
finish();
}
}); }Fragment에서도 동일한 방식으로 사용할 수 있다.
이 방법을 사용하면 Predictive Back과도 자연스럽게 연동된다.
getOnBackPressedDispatcher()은 min SDK가 23 부터 지원하는 내부 프로젝트에서도 적용 가능했다.
WebView는 어떻게 처리할까?
실무에서는 WebView가 가장 많이 사용되는 사례 중 하나다.
기존에는 다음과 같이 구현한 경우가 많다.
@Override
public void onBackPressed() {
if(webView.canGoBack()){
webView.goBack();
}else{
super.onBackPressed();
}
}Predictive Back에서는 다음과 같이 Callback 내부에서 처리하는 것이 좋다.
getOnBackPressedDispatcher().addCallback(
this,
new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
} else {
finish();
}
}
});프로젝트에서 가장 먼저 확인한 항목
SDK 36으로 변경하면서 먼저 프로젝트 전체를 검색했다.
검색한 키워드는 다음과 같다.
onBackPressed(KEYCODE_BACKonKeyDown(dispatchKeyEvent(예상보다 오래된 코드가 많이 남아 있는 경우가 있다.
특히 라이브러리나 오래된 화면은 놓치기 쉽다.
테스트해야 하는 화면
Predictive Back은 단순히 Activity 하나만 테스트해서는 안 된다.
다음 화면을 모두 확인하는 것을 추천한다.
- WebView
- Fragment 전환
- Dialog
- BottomSheet
- Navigation Component
- ViewPager
- DrawerLayout
- “뒤로가기 두 번 종료” 기능
두 번 눌러 종료 기능은?
많은 앱에서 다음과 같은 기능을 제공한다.
뒤로가기 버튼을 한 번 더 누르면 종료됩니다.
이 기능도 Predictive Back과 함께 정상 동작하는지 확인해야 한다.
기존처럼 KEYCODE_BACK을 직접 처리하기보다는 Callback 내부에서 구현하는 것이 유지보수에 유리하다.
꼭 수정해야 하는 것은 아니다
여기서 중요한 점이 하나 있다.
모든 프로젝트가 Predictive Back 때문에 수정이 필요한 것은 아니다.
이미
- Navigation Component
- Fragment
- AndroidX
기반으로 구현된 프로젝트라면 대부분 큰 수정 없이 동작한다.
반대로
- 오래된 프로젝트
- onBackPressed()를 많이 사용하는 프로젝트
- KEYCODE_BACK을 직접 처리하는 프로젝트
는 SDK를 올리는 김에 함께 정리하는 것을 추천한다.
마무리
Predictive Back은 Android 16에서 새롭게 추가된 기능이 아니라 Android 13부터 도입된 사용자 경험 개선 기능이다.
하지만 Android SDK를 최신 버전으로 업데이트하는 시점이라면 기존 Back 처리 코드를 점검하기에 가장 좋은 시기이기도 하다.
이번 프로젝트에서는 대부분의 화면이 이미 AndroidX 기반으로 구현되어 있었기 때문에 큰 수정은 필요하지 않았다.
다만 WebView와 일부 레거시 화면은 직접 테스트를 진행했고, 오래된 onBackPressed() 코드는 모두 OnBackPressedDispatcher 기반으로 변경하였다.
SDK 36 대응을 준비하고 있다면 프로젝트 전체에서 onBackPressed()와 KEYCODE_BACK을 먼저 검색해 보는 것부터 시작해 보기를 추천한다.
다음 글 예고
다음 글에서는 TelephonyManager.listen()을 TelephonyCallback으로 변경하는 방법과 실제 적용하면서 주의했던 점을 코드 예제와 함께 정리해 보겠다.
댓글
댓글 쓰기