Android 앱 Process Kill 테스트 방법

겸쓰로이드
5 min readApr 1, 2021

메모리가 부족할 때, App이 강제 종료하는 경우가 있습니다. 이 때는 프로세스 Kill이 되기 때문에, 로그인 및 UI 상태가 유실 될 수 있습니다.

그림 1. 액티비티 생명주기

위 [그림 1]을 보면, onPause() 또는 onStop() 이후에 프로세스 Kill이 발생하는 것을 알 수 있습니다.

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

binding = DataBindingUtil.setContentView(
this,
R.layout.activity_main
)

// SharedPreference로부터 데이터 불러오기
LoginManager.loginData = LoginManager.loadLoginData()

// UI 갱신
subscribeUI()
}
fun loadLoginData(): LoginData =
Utils.restoreLoginPreference() ?: LoginData()
fun restoreLoginPreference(): LoginData? {
val loginString = sharedPreferences.getString("login_state", "")
if (loginString.isNullOrEmpty()) {
return null
}
val obj = jsonToData(loginString, LoginData::class.java)
return obj
}

Process Kill이 진행 된 후, 액티비티를 다시 실행하게 되면 onCreate()가 호출되기 때문에, 위와 같이 onCreate()시점에서 SharedPreference를 이용하면 로그인 상태를 유지할 수 있습니다.

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

binding = DataBindingUtil.setContentView(
this,
R.layout.activity_main
)
// SharedPreference로부터 데이터 불러오기
LoginManager.loginData = LoginManager.loadLoginData()

// UI 갱신
subscribeUI()
// onCreate() 에서 Bundle을 처리하는 방법
if (savedInstanceState != null) {
val data = savedInstanceState.getString(KEY)
binding.textView.text = data
}

}
// onRestoreInstanceState() 에서 Bundle을 처리하는 방법
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
val data = savedInstanceState.getString(KEY)
binding.textView.text = data
}
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
super.onSaveInstanceState(outState, outPersistentState)
val data: String = binding.textView.text.toString()
outState.putStringArrayList(KEY, data)
}

만약 Process Kill 되기 전 UI를 그대로 유지하고 싶다면, onSaveInstanceState()를 사용하면 됩니다. onSaveInstanceState()는 onPause() 이전에 호출되고, 저장하고 싶은 데이터를 Bundle에 저장할 수 있습니다.

그리고, onSaveInstanceState()에서 저장한 Bundle을 사용하는 방법은 onCreate(), onRestoreInstanceState() 2가지 방법이 있습니다.

onCreate()에서는 bundle이 nullable하기 때문에 null 예외처리를 해줘야하고, onRestoreInstanceState()는 onStart() 이후에 호출되는 특징이 있습니다.

하지만, onSaveInstanceState()는 호출 되지 않는 경우도 있어, onPause()에서 SharedPreference()를 활용하는 방법도 있습니다.

그러면 이제 프로세스 Kill 현상을 쉽게 재현하고, 로그인 상태를 유지하여 알맞은 UI를 호출할 수 있게 테스트를 진행해보겠습니다.

Fill Ram Memory APP & 애플리케이션 정보

이러한 현상을 재현하기 위해서, ‘Fill RAM memory’ 라는 앱을 사용할 수 도 있지만, 저는 그냥 앱을 강제종료 해보겠습니다.

애플리케이션 정보에 [강제 중지] 버튼을 누르면, 재현하고자 하는 Process Kill 이 발생합니다.

--

--