[안드로이드 IllegalStateException] Can not be called to deliver a result. finishAffinity 오류 처리하기
테스트할 때는 분명 오류가 없었기에 구글플레이에 업데이트 하였다. 그러나 수 많은 폰들이 존재하기에… 사용자들에게 오류가 발생했고, 파이어베이스 오류보고 관련 이메일이 왔다. 오류가 발생한 휴대폰은 안드로이드9 운영체제를 상요하는 갤럭시 노트8 기기였다.
오류 내용은 다음과 같다.
Fatal Exception: java.lang.IllegalStateException: Can not be called to deliver a result
at android.app.Activity.finishAffinity(Activity.java:5765)
at com.app.test.ExitActivity$1.onClick(ExitActivity.java:55)
at android.view.View.performClick(View.java:7359)
at android.widget.TextView.performClick(TextView.java:14230)
at android.view.View.performClickInternal(View.java:7325)
at android.view.View.access$3200(View.java:846)
at android.view.View$PerformClick.run(View.java:27807)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7073)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
[오류 원인]
메인 액티비티에서 다른 액티비티를 호출할 때 결과를 리턴 받도록 설정을 하였다. 그러나 결과를 리턴하지 않고 종료하는 버튼이 있는데, 이 버튼을 눌렀을 때 finishAffinity()메소드를 호출하여 앱을 종료하였을 때 발생되었다.
(MainActivity.class)
Intent intent = new Intent(MainActivity.this, ExitActivity.class);
//현재 프레그먼트 체크
for (Fragment fragment: getSupportFragmentManager().getFragments()) {
if (fragment.isVisible()) {
if(fragment instanceof HomeFragment){
intent.putExtra("PAGE_TYPE",1);
}else if(fragment instanceof MyNumberFragment){
intent.putExtra("PAGE_TYPE",2);
}
}
}
startActivityForResult(intent, 24);
(ExitActivity.class)
Button buttonExit = findViewById(R.id.button_exit);
buttonExit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finishAffinity();
}
});
[오류 해결 방법]
finishAffinity() 종료 메소드를 호출하기 전에 setResult()메소드를 호출시 취소값을 지정하여 결과 리턴을 취소처리를 해야한다.
setResult(Activity.RESULT_CANCELED);
Button buttonExit = findViewById(R.id.button_exit);
buttonExit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult(Activity.RESULT_CANCELED);
finishAffinity();
}
});
setResult() 더 알아보기