안드로이드 개발 질문/답변
(글 수 45,052)
사용하던 도중에 잠깐 휴대폰 종료버튼을 "짧게"누르면 액정이 꺼지고, pause상태가 되잖아요
그리고 다시 시작하니까 어플이 초기화면으로 돌아가고 설정같은게 싹 초기화되있더군요;
디버거 돌려서 찾아보니까 onCreate메서드를 다시 실행해서 뷰라든가 이런걸 싹 다 새로 재생성하더라구요;
이것을 방지할 수는 없을까요?
어쩐 일인지 예전에 만들던 어플들에서는 이런 일이 발생하지 않고, onCreate가 한번만 실행됫었는데..
이번에는 프로젝트 설정을 잘못했는지, 아니면 다른 이유에서인지 다시 다른 화면으로 전환했다가 다시 올 경우 항상 초기화되있더군요 ㅠㅠ
2012.01.31 13:23:12
onPause된후 메모리 부족등으로 os에서 강제적으로 종료 시킬경우 onCreate부터 시작하게 됩니다.
onSaveInstanceState로 저장될 정보를 전달하면 됩니다.
onSaveInstanceState는 무조건 호출되는 메서드는 아닙니다.
pause시에는 호출되지 않고 메모리 부족하지 않아서 다시 resume으로 복구 된다면 필요없는 메서드 이기 때문에 호출되지 않습니다.
하지만 메모리가 부족하고 강제종료해야하는 상황이면 이 메서드가 호출되어서 임시 정보가 저장됩니다.
각종 원시 타입이 저장 가능하고 시리얼라이즈, Parcelable 객체도 저장 가능합니다.
/*인스턴스화 된 객체 자체를 넘겨야 하는 경우가 있습니다.
방법은 java의 시리얼라이즈 기능으로 객체를 전달하고 onCreate시 복구해서 사용하시면 됩니다.
시리얼라이즈 시킬 객체의 클래스는 시리얼라이즈 구현이 되어야합니다.
우선 클래스는 A 인스턴스화 시킨 객체는 a라고 가정합니다.*/
A실행중 카메라를 띄우면 onPause가 호출되며 백그라운드에 뭍히겠죠
근데 카메라가 메모리 많이 써서A가 강제종료 당한다면 onSaveInstanceState가 호출 되고 종료됩니다.
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putSerializable("instance", a); // putString등도 가능, map collection처럼 키와 값 쌍으로 전달.
}
이렇게 시리얼라이즈시킨 객체를 키, 데이터 쌓으로 넣고 나중에 onCreate에서 참조해서 꺼내시면 됩니다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
A a;
if(savedInstanceState ==null){
a = new A();
}else{
a = (A) savedInstanceState.getSerializable("instance");
}
}
onCreate에 파라메터로 Bundle savedInstanceState 이 전해지는건 아시죠?
onSaveInstanceState에서 사용한 객체 입니다.
이게 널이면new A()로 새로 생성하고 만약 종료할때 저장된 객체가 있다면 null이 아니겠죠.
그럼 저장했던 객체를 다시 꺼내시면 됩니다.
그리고 위에서 말한 시리얼라이즈 구현은
A.java라면 클래스 선언에 implement Serializable 추가 해주시고
꼭 필요한건 아니지만 안붙이면 에러 뱉으니까 멤버 변수에 아무 버전번호를 넣어주세요
private static final long serialVersionUID = 1L;
///--------------------------------------
public class A implement Serializable{
private static final long serialVersionUID = 10101L;
public A(){
}
}




해결책이 될 수 있을진 모르겠으나
http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)
위 링크 한번 보세요.