엄코딩의 개발 일지


 startActivity


프로젝트를 진행하면서 단연 안쓸 수 없는 메소드 중에 하나입니다. 


startActivity는 intent를 통해 설정된 activity로 이동을 시켜주는 메소드입니다.




해당 버튼을 누르면 SecondActivity로 화면전환이 이루어지겠죠?


SecondActivity에 존재하는 버튼을 통해 단순히 finish()를 실행하게 되면, 당연히 MainActivity 화면이 보입니다.




단순하게 다른 activity로의 전환뿐만아니라 전환 후 결과 값을 받아야한다면? 


위 상황에서 사용할 수 있는 메소드가 startActivityForResult 입니다.



 startActivityForResult


위의 startActivity와는 다르게 startActivityForResult를 사용하면 activity로의 전환 후 requestCode를 통해 특정 행위를 할 수 있습니다.



startActivity와는 다르게, 첫 번째 인자는 Intent, 두 번째 인자는 Int값을 매개변수로 필요로합니다.


두 번째 Int값은 requestCode로 사용됩니다. 



startActivityForResult에 대한 처 즉, MainActivity에서 startActivityForResult를 통해 SecondActivity에서의 특정 행위


에 대한 결과값을 처리하기 위해 onActivityResult를 오버라이드합니다.


SecondActivity에는 버튼을 2개 추가하여 회원가입, 로그인을 처리한다고 가정해 보겠습니다.



setResult를 통해 resultCode를 반환 후, MainActivity에서 resultCode값을 통해 각각의 다른 처리를 할 수 있습니다.



각 버튼을 눌렀을 때 해당 resultCode별로 분기처리 할 수 있습니다.


저 같은 경우에는 setResult를 선언하지 않고, 해당 Activity를 종료시켜 다음과 같은 에러가 발생했었습니다.


( 실 패키지명은 packageName로 대체하였습니다. )


 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65537, result=0, data=null} to activity {~~ packageName}: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter data

        at android.app.ActivityThread.deliverResults(ActivityThread.java:4318)

        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4362)

        at android.app.ActivityThread.-wrap19(Unknown Source:0)

        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1672)

        at android.os.Handler.dispatchMessage(Handler.java:106)

        at android.os.Looper.loop(Looper.java:171)

        at android.app.ActivityThread.main(ActivityThread.java:6637)

        at java.lang.reflect.Method.invoke(Native Method)

        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)

        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

     Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter data

        at packageName.EventFragment.onActivityResult(Unknown Source:2)

        at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:151)

        at android.app.Activity.dispatchActivityResult(Activity.java:7351)


위와 같은 에러는 정확한 코드의 위치도 알 수 없었고, 단순하게 널이아닌 곳에서 널이 발생했다 정도만 명시하고 있습니다.


알고보니 A->B->A 화면전환이 이루어지는데 A->B로 갈때 startActivityForResult로 반환값을 요구하고 있었고, 해당 resultCode에서 특정 작업을 하고 있었습니다.


결국, B->A로 전환시 finish()전에 setResult를 해주었더니 해결되었습니다.