본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] startActivityForResult()로 실행되는 activity 가 다른 task에 있다면?

by 돼지왕 왕돼지 2012. 1. 26.
반응형


0. History


- 이 글은 2012-01-26 초안 작성 시작하였습니다.
- 오래된 정보, 잘못된 정보, 오타가 있으면 Comment 남겨주세요. 확인 후 수정하겠습니다.
- 이 글은 2012-01-26 초안 작성 완료하였습니다.




1. Information


제목이 무엇을 말하는지 잘 모르겠어요


우선 이것을 이해하기 위해서는 Task (테스크) 에 대한 이해가 필수적이에요.
테스크가 뭔지 모르신다면, 먼저 Task 를 공부하고 오셔야 합니다. Task 를 모르면 이해할 수 없는 Article 입니다.
여기서는 Task 자체를 다루지는 않겠습니다.

제목의 말은 startActivityForResult()실행되는 activity 가 다른 task 에 있다면 문제가 생길 수 있다는 것을 나타내는 말입니다.
기본적으로 startActivityForResult() API 는 호출을 하면서 onActivityResult() 라는 함수로 호출한 Activity 가 전달하는 return 값을 intent 의 형태로 받도록 되어 있습니다. 하지만 이 API 의 설계 자체가 동일한 Task 에 있을 때만 제대로 작동하도록 되어 있는 녀석이기 때문에, 문제가 발생합니다.



무슨 문제가 발생하나요?


 네, developer 를 참조하여 startActivityForResult() 가 뭐하는 녀석인지 뭔지 알아보겠습니다.
이 녀석에 대한 설명 안에 문제가 되는 사항도 함께 설명되어 있거든요.

public void startActivityForResult( Intent intent, int requestCode )

- Activity 가 작동을 마쳤을 때 그 결과값을 받고 싶은 경우 이 함수를 통해서 activity 를 실행시킵니다.

- 호출한 activity 가 종료할 때 override 한 onActivityResult() 함수가 호출되며 호출시 전달한 requestCode 가 그대로 전달되어 옵니다.
  ( requestCode 가 음수라면 결과를 받지 않는 startActivity( Intent ) 와 같은 효과입니다. )

-  만약 launch 되는 activity 의 launchMode 가 singleTask 라면.. 다른 task 에서 launch 가 될 것이며, 따라서 호출과 동시에 cancel result 를 받게 됩니다.
  ( ACTION_MAIN 또는 ACTION_VIEW 는 보통 singleTask 로 define 되거나 다른 Task 에서 launch 되도록 되어 있죠. )

- 만약 startActivityForResult() 가 음수가 아닌 requestCode 와 함께 onCreate() 나 onResume() 등에서 수행된다면, 결과값을 받아 올 때까지 화면에는 어떤 것도 display 되지 않습니다. 이것은 다른 activity 로 전환할 때 화면이 깜빡이는 현상을 막기 위해서 사용되곤 합니다. 


자 여기서 포인트는 이 녀석입니다.

-  만약 launch 되는 activity 의 launchMode 가 singleTask 라면..
   다른 task 에서 launch 가 될 것이며, 따라서 호출과 동시에 cancel result 를 받게 됩니다.


만약 startActivityForResult() 를 API 목적 그대로 result 받으려 했는데, 이 Activity 가 다른 Task 에서 Launch 가 된다면,
제대로 결과를 받아올 수 없습니다. 무조건 호출하자마자 Cancel 이 불립니다.

이유를 확실히 안다면 이 문제를 가지고 하루 종일 씨름 할 필요는 없겠지요?
건투를 빕니다.


손가락 추천 꾸욱~ 더 좋은 글로 보답하겠습니다.


2. Summary


- startActivityForResult() 는 동일 Task 에서 launch 되는 activity 에 대해서만 올바르게 작동한다는 문제점이 있습니다.

- ACTION_MAIN 또는 ACTION_VIEW 를 action name 으로 가지는 intent 를 비롯하여, launchMode = singleTask 로 지정된 activity 를 startActivityForResult() 를 통해 실행시키면 onActivityResult() 에 즉각적으로 cancel 결과가 return 됩니다. 이 점을 주의해서 뻘짓을 줄여야겠습니다.




3. References


http://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int) 
   Android Developer Doc. Activity 의 startActivityForResult()




4. Tags






반응형

댓글