A activity에서 startActivityForResult를 이용하여 갤러리를 호출합니다.
// 갤러리에서 사진 가져오기
protected void getGallaryImage() {
//앨범에서 사진 가져오기
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
startActivityForResult(intent, TAKE_GALLERY);
}
이런식으로 호출을 하고
protected void onActivityResult(int requestCode, int resultCode, Intent data)
으로 값을 받는데요..
문제는 A activity가 갤러리 Intent가 뜨는 도중에 강제종료되었다가 재시작이 되는 경우가 있습니다. 주로 옛날(?) 기종에서 많이 발생하는데요..메모리가 넉넉지 않는 기종이죠..아니면 어플이 많이 설치되어 서비스가 많이 구동되고 있는 기종들이 해당되구요..
그래서 이렇게 강제종료되었다가 재시작이 되는경우 onActivityResult로 call back이 안됩니다. 당연하지요..종료되었다가 재시작되었으니..
이런경우 어떻게 처리하는지 조언좀 부탁드립니다.
아무리 검색해도 이런 예외적인 케이스를 처리한 샘플이나 내용은 없는데 분명히 저만 그런게 아니라 많이 발생될걸로 예상되는데 자료가 없네요...
게시판같은 형식에 갤러리에서 이미지 불러와 여러장 첨부하는 이런 경우의 어플들도 꽤 되는데..
어떻게 처리했는지..
아시는 분 답변좀 부탁드려요..ㅜㅜ..오래전부터 문제였는데 몇개월째 해결 못하고 있습니다.
사용자들에게 메모리 정리후 다시 시도하라는 답변만 계속 하고 있네요..ㅜㅜ
액티비티 클래스는 finish()와 함께 사라지므로 액티비티 클래스를 싱글톤화 하는게 아니라
싱글톤 클래스를 통해서 C의 전역변수를 사용하듯 데이터를 관리하는 개념입니다.
이렇게 되면 데이터가 액티비티에 종속되지 않음으로서 액티비티의 생명주기에 영향을 받지 않습니다.
즉 A -> B -> A 로 액티비티가 동작하는 과정에서 putExtra와 activityResult 를 통해 데이터를 주고받지 않고
A finish() -> B finish() -> A 넘어가면서 onCreate 에서 싱글톤 클래스를 통해서 관리하면 되겠습니다.
자바 싱글톤 만드는 방법은 사방에 널려있으니 맞는 타입의 싱글톤을 활용하시면 되겠습니다.
A-->B실행중 finish했을 때, A가 종료되었다 다시 실행되었다 하더라도 A로 onActivityResult()잘 갈껄요.
이게 안가는 경우가 생기면 문제가 상당할 것 같은데요. Google에 Report해야할 일 같습니다.
어떤 기종이 그런지 알 수 있을까요?
제가 생각할 때,
1. A액티비티 실행
2. B액티비티 실행(startActivityForResult())
3. B실행 중 시스템이 A강제종료 - A에게 onDestroy(), onSaveInstanceState()호출됨
4. B액티비티 finish()
5. A액티비티 시스템에 의해 다시 살아남 - A의 생성자와 onCreate(Bundle b) 호출됨
6. A의 onActivityResult()호출됨
과 같은 과정이 정상적인 것으로 생각되는데,
이 중 6번이 안불리는지 혹은 다른 부분도 그냥 넘어가는 지 궁금합니다.
만약 위 과정을 정상적으로 따른다면, 이전 상태를 저장하고 복구할 기회는 충분히 있겠죠.
onSaveInstanceState()가 불리면 현재 Activity에서 중요한 멤버변수는 모두 저장해야 합니다. Parcelable이 아닌 객체는 어떤식으로든 Parcelable/Serializable한 객체로 만들어 Bundle에 저장해야 합니다. 후에 onCreate()가 불리면 파라미터로 넘어오는 Bundle이 null인지 체크하고 null이 아니면 Bundle로부터 데이터를 풀어 이전 onSaveInstanceState()가 불렸던 시점의 상태로 완벽하게 되돌릴 수 있어야 합니다.
그리고 onActivityResult()도 호출이 될것으로 믿습니다(^^). 이 시점은 onCreate()에 의해 이전상태로 복구된 후이기 때문에 진행에 아무 문제가 없어야 겠죠.
이런 과정이 귀찮으면 싱글톤이나 Application object에 상태값을 저장하는 방법도 있는데, 이 방법도 시스템이 액티비티 뿐 아니라 해당 프로세스까지 죽이면 대책이 없습니다.




액티비티간 데이터를 주고받는 문제에있어 다음과 같은 점을 고려하면 될듯합니다.
A -> B 로 넘어가면서는 putextra를 쓸 수 있지만 복잡한 데이터를 넘기기는 귀찮다.
B -> A 로 다시 돌아가서 결과값으로 통보하고 싶지만 안드로이드 OS가 A를 강제종료 시킨다.
결국 싱글톤 클래스가 답입니다... --;
왜냐고 묻는다면 B를 호출한 A액티비티의 생존을 장담할 수 없기때문입니다.
그리고 쓰다보면 싱글톤이 훨씬 간결해요.