프로그래밍/Java, Android

[Android] 가로세로전환과 쿼티자판 열때 생기는 프로그램 초기화 현상 처리 (액티비티 재시작 처리)

당근천국 2011. 1. 16. 14:52

참고 : 안드로이드펍 안떠니 님의 글( 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는 저장할 때 getLastNonConfigurationInstance는 불러올 때 사용되며 엑티비티가 죽을 때 onRetainNonConfigurationInstance를 호출할 필요 없이 죽을 때 알아서 실행됩니다.


 
4. Object onRetainNonConfigurationInstance
저장해야 할 내용을 여기에 저장하여 리턴하면 getLastNonConfigurationInstance를 통해 불러올 수 있습니다.
여러 개를 저장 가능 한지는 모르겠는데 저는 어차피 편의상 저장용 클래스(claActivityBackup)를 하나 만들었습니다.....
(이 방법이 여러 가지 면으로 편하죠)
@Overridepublic
 Object onRetainNonConfigurationInstance()
{
	//화면전환시 저장되있어야 하는 내용을 저장하기위한 클래스
	claActivityBackup insAB = new claActivityBackup();
     	//DB관리클래스 저장
	insAB.alData = (ArrayList)alData.clone();
	insAB.intA = 1;
	
	return insAB;
}

이렇게 하면 됩니다.
마지막에 리턴하는 객체가 저장되어 엑티비티가 재시작하여도 불러다 쓸 수 있는 데이터가 되죠.

이 코드에서 주의할 점은
insAB.alData = (ArrayList)alData.clone();
이것입니다.

객체를 저장할 때 클론을 이용하여 객체를 저장하지 않으면 메모리상의 주소만 남기 때문에 null이나 쓰레기 값이 들어가게 됩니다.


이런 원리로 말이죠.


 
5. getLastNonConfigurationInstance
이 인터페이스는 보통 온크래디트에서 불러와 엑티비티에 데이터를 전달합니다.
final Object objBackupData = getLastNonConfigurationInstance();
//저장되있는 데이터가 있는지?
if( objBackupData != null )
{
	//있다면
	claActivityBackup insAB = (claActivityBackup)objBackupData;
	this.intA = insAB.intA;	this.alData = insAB.alData.clone();
}

 

여기서도 마찬가지로 객체는 클론으로 받아와야 예상치 못한 동작을 막을 수 있습니다.