[번역] Android에서 System.exit() 사용 시 주의 사항

들어가며

필자가 Android 응용 프로그램을 개발하면서 초기 화면이 아닌 다른 화면에서 응용 프로그램을 종료하려고 했던 적이 있었다. 여기에서 Java의 System.exit(0) 또는 Kotlin의 exitProcess(0)을 사용했었다. 하지만 의도치 읺게 응용 프로그램이 다시 시작하는 문제가 있었고, 이에 관한 정보를 찾아보았다.

System.exit() 사용 사례 예시

단순히 MainActivitySecondActivity만 있는 응용 프로그램을 구현하였다고 가정해보겠다. 물론, AndroidManifest.xml 파일에 특별한 내용도 없다. 화면 구성도 버튼 하나로 매우 단순하다.

MainActivity에서는 아래 코드와 같이 SecondActivity를 호출한다.

Kotlin
btn_launch.setOnClickListener {
    startActivity(Intent(this, SecondActivity::class.java))
}

그리고 SecondActivity에서는 응용 프로그램을 종료하기 위해 exitProcess(2)를 호출한다.

Kotlin
btn_action.setOnClickListener {
    exitProcess(2) //same as System.exit(2)
}

이제 이러한 예시를 따라가 본다. 사용자가 응용 프로그램을 실행하면 첫 번째 화면이 나타날 것이다. 여기에서 버튼을 누르면 두 번째 화면이 나타날 것이다. 여기에서 버튼을 누르면 응용 프로그램이 종료될까?

결과는 그렇지 않을 것이다.

System.exit()

현재 실행 중인 Java Virtual Machine을 종료한다. 인수는 상태 코드의 역할을 한ㄷ. 일반적으로 0이 아닌 상태 코드는 비정상적인 종료를 나타낸다.

developer.android.com

즉, 시스템이 응용 프로그램의 실행 프로세스를 종료하고 모든 관련 데이터(현재 Activity, 응용 프로그램 데이터 등)를 종료한다고 말할 수 있다.

Logcat을 자세히 보면 다음과 같은 내용을 볼 수 있다.

I/ActivityManager: Start proc 28995:com.sample/u0a11 for activity {com.sample/com.sample.MainActivity}
I/d.sample: System.exit called, VM exiting with result code 2
I/ActivityManager: Process com.sample (pid 28995) has died: fore TOP 
W/ActivityTaskManager: Force removing ActivityRecord{ com.sample/.SecondActivity t4191}: app died, no saved state
I/ActivityManager: Start proc 29043:com.sample/u0a11 for activity {com.sample/com.sample.MainActivity}

문서에 명시적으로 언급되지 않은 것은 일시 중지된 응용 프로그램의 Activity가 있는 경우(즉, 완료되지 않은 경우) 해당 Activity가 Activity Stack에 보관되고 더 이상 Activity가 없으면 재개된다는 것이다.

해결 방안

해결 방안은 간단한데, Activity를 종료하기 위해 finish()를 호출하면 된다. 물론 스택에 더 많은 Activity가 있는 사용 사례가 있을 수도 있다. finishAffinity()를 사용하면 상위 스택에 쌓인 Activity를 종료할 수 있다.

마치며

필자가 Android 응용 프로그램을 개발하면서 종료 기능 구현을 위하여 System.exit(0) 코드를 사용하였는데, 이러한 코드의 개념과 역할을 자세하게 알게 되는 계기가 되었다. 이러한 사항이 아니더라도 다른 주의 사항이 있다면 사용자에게 알려주고 싶다는 생각이 들었다.

자료 출처

원문 보기

댓글 남기기