개발/트러블 슈팅

03/05 Toolbar 이동 기능 트러블 슈팅

sos000303 2024. 3. 5. 18:47
728x90

저번 글에서 액티비티를 이동할 때 있었던 문제에 대해서 아주 짧게 이야기 했었는데 여기서 풀어보겠다.

처음 만들고 싶었던 기능은 Activity를 이동할 때마다 MainActivity를 제외한 모든 Activity를 종료하는 것이었다.

이러한 기능에 대해서는 finish()를 이용해 쉽게 구현할 수 있었는데 문제는 많은 액티비티가 추가되고 발생했다.

1. 문제의 발생(Activity 명에서 Activity생략)

설명을 위해 만든 Level

Level 3인 Add에서도 다른 Level 2로 이동할 수 있게 구현했는데 이때 Team이 꺼지지 않고 이동한 Activity에서 뒤로가기 버튼을 누르면 실행중인 Team이 나왔다.

2. 사실 확인 및 원인 분석

Add에서 뒤로가기 버튼을 눌렀을 때 Team이 나오도록 Team에서 Add로 가는 버튼에는 finish()를 넣지 않았다. 따라서 이동할 때 사용한 finish()는 Add만 종료했고 Team은 그대로 실행중이었다.

따라서 Add -> Level 2로 이동할 때 Team이 꺼지지 않은 것이 문제라고 할 수 있다.

3. 시도 및 결과

1. 실패

TeamActivity().finish()

위와 같은 코드를 작성했을 때 경고메세지가 표시되지 않아 Team을 종료할 수 있을 것이라고 생각했지만 실패했다.

2. 실패

intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK OR Intent.FLAG_ACTIVITY_NEW_TASK

인터넷을 검색해 인텐트에 다음과 같은 플래그를 추가했지만 이동할 액티비티를 제외한 모든 액티비티가 꺼지는 것 같은 효과가 나와 다른 방법을 찾아보았다.

3. 실패

intent = Intent.FLAG_ACTIVITY_CLEAR_TOP

이 플래그는 기존 실행중이던 액티비티를 시작할 때 시작하는 대신 원래 실행중이던 액티비티 위에 있는 스택을 모두 종료시키는 플래그였다.

4. 성공?

// TeamActivity code
companion object{
    lateinit val teamActivity: TeamActivity
}

~~~

val teamActivity = this

//AddActivity code
val teamActivity = TeamActivity.teamActivity

~~~

teamActivity.finish()

인터넷을 찾아보던 중 위 코드와 같이 실행중인 Team을 변수로 선언해 companion object를 이용해 다음 엑티비티로 넘겨주는 방법을 찾아서 적용해 보았다. 성공적으로 Team을 종료시켰다.

피드백

발표 후에 튜터님께 생명주기, 스택, 인텐트 플래그에 대해 좀 더 공부해보라는 피드백을 받았다.

공식문서 플래그가 모두 있는 페이지, 기타 페이지들을 찾아 공부해보았고 companion object를 사용하는 방법은 좋은 방법이 아니라는 얘기가 많았다.

글을 작성하는 시점인 오늘 새로운 방법을 시도했다.

새로운 시도

인텐트 두 개를 이용해 Main을 불러오고 나서 다른 액티비티를 불러오는 방법을 적용했다.

if (pageNumber == 3) {
    val intent2 = Intent(activity, MainActivity::class.java)
    intent2.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
    startActivity(activity, intent2, null)
}
val intent = Intent(activity, TeamActivity::class.java)
startActivity(activity, intent, null)
if (pageNumber != 0) activity.finish()

반영본에서 일부 코드를 발췌했다. 조건문은 툴바 기능을 함수로 바꾸는 과정에서 생겼다. 현재 액티비티가 Add면 CLEAR_TOP을 이용해 Main을 불러오며 Main위의 스택을 모두 끈다. 그 후 원하는 액티비티를 불러왔다.

사실 생명주기가 짧은 fragment를 이용하면 편하게 해결할 수 있는 문제였는데 Activity에서 해결할 수 없을까 고민하다가 이런식으로 결론을 냈다.

이 방법을 통해 companion object를 사용하지 않고, 아직 포스팅하지는 않았지만 툴바의 파라미터 수도 줄일 수 있었다.

728x90