안드로이드 개발 정보
(글 수 1,067)
안녕하세요 아즈라엘 입니다
이번에 제가 하는 프로젝트에서 .mp4를 플레이 하는 화면이 많이 있습니다.
예를들어 MainActivity에서 30mb 용량의 mp4파일을 플레이 합니다.
물론 30mb 를 로딩하는데 디바이스마다 천차만별로 속도차이 납니다.
겔럭시 s1에서 느려터진 속도로 잘 로딩합니다..ㅠㅠ
그리고 Sub1Activity로 startActivity를 하고 그곳에서도 mp4파일을 플레이 합니다.
플레이를 하고 홈키를 누르고 다시 들어오면 surfaceView가 파괴되어 MainActivity
holder callback 이 다시 불리워집니다.
task affinity 가 안맞아서 그러는건지 아니면 surface holder를 런처는 다시 부르는건지 잘 모르것습니다.ㅜㅜ
이번엔 MainActivity에서 Sub2Activity를 호출합니다.
문제는 MainActivity 는 세로모드 Sub2Activity는 가로 모드입니다.
이로 인해서 불리워지자마자 surfaceView가 파괴되고 holder callback 이 다시 불리워집니다.
물론 디바이스 성능이 좋으면 다시 생성시키는데 금새인데 겔럭시 s1에서는 치명적으로 작용됩니다.
제가 말한 증상에 대해서 경험이 있거나 도움이 될만한 충고는 서슴없이 해주시면 감사하겠습니다. ^^
여러분들도 개발하시는데 참고 하시길 바랍니다.
앱 입장에서 보면 java 단에서 단지 SurfaceView Class를 사용하지만, 이것이 실제로는 SurfaceFlinger(C/C++단) 에 연결되어 각 SurfaceView마다 Graphic Area Memory (일반적 Heap 메모리와는 다른)를 별도로 할당 받게 됩니다. 동영상/카메라 (Overlay) 의 경우는 H/W Driver 단의 resource 까지 먹게 되구, Platform 의존성이 커집니다. 메모리는 한정되어 있으므로, Framework에서는 SurfaceView의 Visibility 변경에 따라 해제 및 재성성을 반복해 주는 구조로 되어 있습니다. 그 때의 callback은 surface holder를 통해 전달되는 것이구요. SurfaceFlinger & Framework 단의 설계가 그렇게 되어 있는다는 것을 말씀 드리고 싶습니다.