본문 바로가기

Android

SurfaceView(Thread)가 drawing중일때 Hold키 입력후, 복귀 문제

출처 : 안드로이드펍(http://www.androidpub.com/856528) 치토스님의 글

 

 

 

질문

 

안녕하세요
현재 Activity를 상속받아 내부클래스로 SurfaceView를 drawing 하고 있습니다.
물론, SurfaceView에 관한 Thread클래스도 별도로 가지고 있구여.

Homekey, Backkey에 대한 처리는 SurfaceDestroy함수에서 Thread를 Pause하도록 처리하여, 화면 복귀시 정상적으로 이전화면으로 복귀하고 있습니다.

문제는 작업 중, Hold키를 입력할경우 OnDestroy함수가 호출되며, Activity가 재생성되어버려 화면이 초기화 되고 잇습니다.
처음에는 OnDestroy에 처리구문이 없어 Hold키 누른후 다시 해제 하면 어플의 이전화면복귀를 하고 있는것 같은데 오류가 나길래
Thread.stop을 OnDestroy에서 처리해주니 정상적으로 돌아옵니다. 단, 어플이 재생성되어버려 이전화면의 데이터가 모두 초기화가 되고 있습니다.
onSaveInstanceState를 이용하여 데이터를 백업하고 복구시키는 방식으로 하려고 하였으나, 대부분의 데이터가 realTime데이터들이고 워낙 양이 많아 다른 대응책을 찾고 있는데, 혹 이런 문제를 해결하신 분이 있으시면 도움 부탁드립니다.

즐거운 하루 되세요

 

답변

 

늦었지만 자답하겠습니다.

Hold키 입력후 해제시 onDestroy가 강제 호출되는 문제는, 확인결과 Hold상태가 해제됨과 동시에 센서상 현위치기점으로 화면이 potrait인지 landscape인지를 결정하고 강제로 activity가 재생성 되버리는 문제로 확인하였습니다.
의외로 간단한 문제였습니다

자료를 검색해보시면 가로,세로 전환시 activity재생성에 대한 문제 해결책들이 많은데, 이부분을 적용하였을때 해결이 되었습니다. 위에 설명드린바와 같이 Hold상태였다가 해제가 되면 시스템적으로 actvitiy의 디스플레이 상태를 재확인하여 feedback이 오는것으로 확인됩니다.
아래 링크를 보시고 적용하여 테스트 해보시길 바랍니다.

 

 

문제의 해결책

 

안드로이드 화면에서 가로화면에서 세로화면으로, 세로화면에서 가로화면으로 전환할 때,
원치않게 값이 날라가버리는 시츄에이션이 발생한다. -_-;

특히나, 키 입력이 수월한 가로화면에서 텍스트를 입력한 후에 가로화면으로 전환했을 때 기껏 작성한 텍스트가 날라간 것을 경험해본 사람은 몇명 있을거다.

화면 전환시에 저장된 값이 Activity의 onDestroy()와 onCreate()를 다시 거치면서 사라지게 되는 문제인데,
이를 해결하기 위한 방법은 3가지 정도로 줄여진다.

1. restore(); 함수를 사용하여 화면 전환 전의 값을 유지하게 하는 방법
2. AndroidManifest.xml 파일의 Activity에 속성을 추가해 주는 방법 

3. 화면 전환을 하지 못하게 하는 방법 -_-;

어찌보면 가장 쉽고 일관성있는 방법은 3번이다.
이는 해당 액티비티 클래스에서 setContentView() 함수 아래에
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 를 선언하면 된다.  
혹은 매니패스트에서 해당 액티비티 아래에 android:screenOrientation="portrait"를 추가해주면 된다.
(요러면 화면이 세로화면으로 넘어가지지 않는다. 즉, 필드 값이 날라갈 일을 원천적으로 봉ㅋ쇄ㅋ 하는 것!)
그렇지만 이 방법은 가로 세로간에 화면전환이 필요한 작업(동영상 play, 가로 화면에서 텍스트 입력)등에는 적절치 못하다.

1번 방법은 구현도 어려울뿐더러, 필드 데이터 값을 일일이 수동으로 저장해 이를 다시 불러오게 하는 방법 같은데..
(사실은 어려워보여 정독 안했음 ㅈㅅ..) 잉여 시간이 많다면 나중에 도전해 보아야 겠다. ㅠ
그래도 1번 방법을 보길 원한다면 [여기]를 클릭!

가로 세로간의 화면 전환시에도 데이터 필드의 값을 확실하게 저장할 수 있는 손쉬운 방법은 다름아닌 2번이 되겠다.
매니페스트 파일에서 각각의 액티비티 속성값을 단 한줄만 추가해 주면 된다는 말씀. 핫핫

<ACTIVITY android:configChanges="orientation|keyboard" android:name="TTS_SmsReader_App_Menu"/>
<ACTIVITY android:configChanges="orientation|keyboard" android:name="TTS_SmsReader_App_Settings"/>
<ACTIVITY android:configChanges="orientation|keyboard" android:name="TTS_SmsReader_Info"/>

위 코드에서 빨간색으로 작성된것이 그 예이다.
매니페스트 파일안에 선언된 3개의 액티비티에 android:configChanges="orientation|keyboard" 를 추가해 주었다.
이로써 확실한건, 키 입력을 자유로이 가로화면에서 쓰고, 작업을 위해 세로화면으로 돌려도 멀쩡하다.
이미지 뷰어나 인터넷창 같은건 아직 테스트 해보진 못했지만.. 되겠지?!;;;