안드로이드

onRetainnonconfigurationinstance getlastnonconfigurationinstance

raulyo 2012. 8. 1. 10:33

참고 : 안드로이드펍 안떠니 님의 글( 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)를 하나 만들었습니다.....
(이 방법이 여러가지 면으로 편하저)
1
2
3
4
5
6
7
8
9
10
11
@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
이 인터페이스는 보통 온크래디트에서 불러와 엑티비티에 데이터를 전달합니다.
1
2
3
4
5
6
7
8
final Object objBackupData = getLastNonConfigurationInstance();
//저장되있는 데이터가 있는지?
if( objBackupData != null )
{
    //있다면
    claActivityBackup insAB = (claActivityBackup)objBackupData;
    this.intA = insAB.intA; this.alData = insAB.alData.clone();
}

 

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