안드로이드 객체 onSaveInstanceState 질문드립니다!

조회수 1325회

현재 onSaveInstanceState을 사용하여 비정상적으로 종료되었을때 액티비티 상태를 저장하고 싶습니다.

  public static Google_map_fragment obj_google_map_fragment;
    public static Control_fragment obj_Conntrol_fragment;
    public  Context Main_context = Main_Activity.this;
    FragmentTransaction frt;
    TedPermission myTed = null;
    private BackPressCloseHandler backPressCloseHandler;

현재 Main_activity에는 2개의 fragment객체와 나머지 객체들이 있습니다.

onSaveInstanceState을 통해 저장하려고 보니, .putString, .putInt 이런것뿐이더라구요. 혹시 객체 자체를 저장해주는 put~~가 있나요? 아니면 어떻게 저장할 수 있을까요?

또, 현재 fragment(화면)이 2개 있는데 이것들도 각각 저장 복원 해줘야 하나요?

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    객체의 경우 Serializable 또는 Parcelable 을 구현하여 Bundle 에 저장 할 수 있습니다. 참고 하실점은 Bundle 에는 저장 할 수 있는 데이터 크기 제한이 있으므로 비교적 가벼운 데이터를 저장하시길 권장드리며 ViewModel, Database, Preference 등을 혼합하여 저장/복구 전략을 세우시는 것이 좋습니다.

    ActivityFragment 는 기본적으로 저장/복원 되는 데이터가 있습니다. 레이아웃 계층을 저장/복원 하는것이 그중 하나입니다. 그렇기 때문에 onSaveInstanceState() , onRestoreInstanceState() 를 오버라이딩 하여 사용 할 경우 super 메소드를 반드시 호출 해야 하며, Activity 의 경우 fragmentstack 상태를 보존한다거나, Fragment 는 이전에 setArguments() 로 저장 된 Bundle 데이터가 있으면 기본적으로 저장 및 복원 합니다. 이 외에도 기본적으로 저장 및 복원 되는 데이터가 어떤 것이 있는지는 Activity 와 Fragment 의 내부코드를 살펴보시면 도움이 되실 것 같습니다.

    onSaveInstanceState() 에는 예를들어 EditText 가 있는 경우 입력 된 값을 저장하는 것과 같이 위젯의 상태값 또는 보존해야 할 변수 값을 저장하거나, 가벼운 객체자체를 저장하는 정도로 사용될 수 있습니다.

    설정 - 개발자옵션활동보관안함 또는 액티비티유지안함 기능을 활성화 하면, 앱 실행 중 홈 버튼 클릭 시 항상 액티비티 인스턴스를 종료 하기 때문에 onSaveInstanceState() / onRestoreInstanceState() 상황을 테스트하기 용이합니다. 이 테스트 방법을 통해 실제로 어떤 데이터들을 저장/복구 하면 되는지 전략을 세우시면 될 것 같습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 어렵네요... 만약에 Main에서 객체 A를 만들었습니다. 그럼 Main에서 복구하려고 하면 객체 A를 복구해야 하는데 조금 찾아보니 Parcelable를써서 객체A 안에있는 내용을 저장하는 것 같습니다. 여기서 질문이 있습니다. 만약 객체A안에 또 다른 객체 B가 있으면 어떻게 해야하나요? 객체 B에서 implements Parcelabe을 또다시 해줘야 하나요? 심승현 2018.8.10 18:50
    • 네 객체 자체를 Bundle 담아야 하니 아무래도 그렇겠지요. save/restore 부분이 생각보다 고려해야할 부분이 많습니다. 종종 save/restore 에 대해 앱을 재실행 하는 방법으로 처리하는 경우도 보았구요. 알 수 없는 사용자 2018.8.11 10:35
    • 크흠.. 그렇군요! 감사드립니다. 오늘도 많은걸 알아갑니다. 심승현 2018.8.11 13:54

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)