[Android] 가로세로전환과 쿼티자판 열때 생기는 프로그램 초기화 현상 처리 (액티비티 재시작 처리)
참고 : 안드로이드펍 안떠니 님의 글( http://www.androidpub.com/?mid=android_dev_info&category=127161&document_srl=742429 )
침묵님의 블로그 ( http://silence2.tistory.com/entry/Faster-Screen-Orientation-Change )
안드로이드(android) 프로그래밍을 하다 안 사실이지만 엑티비티는 으외로 생명주기가 짧습니다 -_-;
( 2.1 이하버전일때 )
아직 2.2sdk를 만져보지 않아서 2.2 에서는 어떤지 모르겠네요.
|
1. 시도 때도 없이 엑티비티는 재시작 된다. |
일단 안드로이드에서 가로세로 전환과 쿼티자판( 다른 키보드라도 )을 열었을 때 엑티비티가 재시작됩니다.
이 소리는 다른 말로 해서 껐다가 켜나 같은 현상이라는 소리죠 -_-;
아니야!!!! 그건 현실이 아닐 꺼야!!!
머 설명에 따르면 화면을 다시 구성하기 위해서라나 뭐라나.
하지만 스마트폰을 돌릴 때 마다 엑티비티가 재시작되면 어디 불편해서 쓰겠나 -_-;;;
그래서 화면 전환이 필요 없다면 아예 돌리는 걸 막는 방법도 있긴 합니다 ㅎㅎㅎ
하지만 그렇지 않은 경우가 더 많잖아!!!!!
|
2. 그는 차캐습니다. |
당연한 것이겠지만 이것에 대한 예방책은 안드로이드에 있습니다.
어디에 라도 데이터를 저장해두었다가 온크래디트에서 불러오면 되지 ㅋ
하지만 너무 번거롭다!!!!
그래서 우리의 안선생님이 말씀하셨습니다.
"onRetainNonConfigurationInstance" 를 쓰거라
오....오오오오오오오오!!!!!!!
|
3. onRetainNonConfigurationInstance 하고 getLastNonConfigurationInstance 하고~ |
이 인터페이스를 이용해 필요한 내용을 저장하고 온크래디트에서 불러올 수 있습니다.
onRetainNonConfigurationInstance는 저장할 때 getLastNonConfigurationInstance는 불러올 때 사용되며 엑티비티가 죽을 때 onRetainNonConfigurationInstance를 호출할 필요 없이 죽을 때 알아서 실행됩니다.
|
4. Object onRetainNonConfigurationInstance |
여러 개를 저장 가능 한지는 모르겠는데 저는 어차피 편의상 저장용 클래스(claActivityBackup)를 하나 만들었습니다.....
(이 방법이 여러 가지 면으로 편하죠)
@Overridepublic Object onRetainNonConfigurationInstance() { //화면전환시 저장되있어야 하는 내용을 저장하기위한 클래스 claActivityBackup insAB = new claActivityBackup(); //DB관리클래스 저장 insAB.alData = (ArrayList)alData.clone(); insAB.intA = 1; return insAB; }
이렇게 하면 됩니다. 여기서도 마찬가지로 객체는 클론으로 받아와야 예상치 못한 동작을 막을 수 있습니다.
마지막에 리턴하는 객체가 저장되어 엑티비티가 재시작하여도 불러다 쓸 수 있는 데이터가 되죠.
이 코드에서 주의할 점은
insAB.alData = (ArrayList
이것입니다.
객체를 저장할 때 클론을 이용하여 객체를 저장하지 않으면 메모리상의 주소만 남기 때문에 null이나 쓰레기 값이 들어가게 됩니다.
이런 원리로 말이죠.
이 인터페이스는 보통 온크래디트에서 불러와 엑티비티에 데이터를 전달합니다.
5. getLastNonConfigurationInstance final Object objBackupData = getLastNonConfigurationInstance();
//저장되있는 데이터가 있는지?
if( objBackupData != null )
{
//있다면
claActivityBackup insAB = (claActivityBackup)objBackupData;
this.intA = insAB.intA; this.alData = insAB.alData.clone();
}