안드로이드 개발을 하다보면 리스트나 특정 아이템의 데이터를 최신으로 유지해야 하는 경우가 있는데요.

특히 Stack에 쌓여있는 Activity로 유저가 Back버튼으로 혹은 뒤로가는 아이콘을 클릭해서,

이동할 경우 onResume이 호출되지 않아서,

최신으로 데이터가 유지되지 않는 버그가 발생하기도 합니다.

오늘은 이에 대해서 어떻게 대응해야 하는지 정리해 보도록 하겠습니다.

 

우선 Stack과 BackStack에 대한 기본적인 부분들을 정리해 보고,

어떻게 onResume을 호출하게 할지 알아보도록 하겠습니다.

 

1. Stack 그리고 BackStack

Stack과 BackStack은 activity가 거주하는 공간입니다.

그리고 자료형태로는 Stack의 형태를 잡고 있습니다.

하나의 Stack에 특별히 어떤 코드나 UX의 변경이 없다면,

Activity들이 쌓이게 됩니다

 

startActivity()메소드를 사용하면,

새로운 액티비티들은 Task의 BackStack에 쌓이게 됩니다.

마찬가지로 finish()함수를 사용하면,

BackStack의 위에 있는 Activity가 finish되게 되지요.

아래는 공식문서에 있는 이미지로서,

이를 그림으로 나타낸 것 입니다.

 

 

2. Stack 관련 케이스들

2-1. Home버튼을 누른 경우

가장 기본적인 형태는 위에서 알아보았으니,

이제는 유저가 Home버튼을 눌러서 앱을 나가버리면 어떻게 될까요?

Task가 전부 Background로 들어가게 됩니다.

OS에서 Task버튼을 누르거나 해당 앱의 아이콘을 누르면,

이 Task는 다시 Foreground로 들어오게 되지요.

 

2-2. 중복으로 많은 액티비티들이 Stack에 쌓이게 되는 경우

앱을 만들다 보면 A액티비티->B액티비티->C액티비티->B액티비티->C액티비티 와 같이

UX가 만들어 질 경우가 있습니다.

중복으로 B와 C액티비티가 계속 스택에 쌓이게 되는 것 이지요.

 

유저는 Home인 A액티비티로 돌아가기 위해서,

Back버튼도 매우 많이 눌러야 할 것이구요.

B와 C페이지들이 네트워크 호출등을 하고 있다면,

낭비도 매우 심할 것 입니다.

 

그래서 이럴 경우는,

메너페스트에서 launchMode = "singleTop"으로 설정해 주거나,

인텐트 호출시

Intent.FLAG_ACTIVITY_SINGLE_TOP 인텐트 flag를  사용해서,

이렇게 되면 유저는 back버튼으로 돌아가더라도

중복된 액티비티를 볼 필요는 없게 됩니다.

back버튼 횟수도 줄어들게 되겠지요.

 

 

 

 

 

+ Recent posts