1

질문이 있습니다. 지금은 안드로이드 활동 라이프 사이클에 대해 배우고 있습니다 . 장치의 방향 변경에 약간의 문제가있었습니다.오리엔테이션 변경시 활동 상태 관리 (Android)

필자의 경우 나는 꽤 복잡한 데이터 구조를 가지고있다. 이 객체를 새로운 객체 인 액티비티에 전달하는 유지 된 조각 메서드가 마음에 들지 않아 더 가벼운 무게 때문에 기각 된 onRetainNonConfigurationInstance() 메서드를 사용합니다. 이것을 사용하는데 큰 단점이 있습니까 ? 내가 예를 들어, (내 경우에는 레이아웃 XML에서) 정의 TextEdits을 활동과 전망을 가지고 뭔가를 작성하고 다음 방향 변경을 이 발생할 때

는 내가 경험입니다 않은 또 다른 것은 즉, TextEdits는 유지

주 (나는 쓰여진 텍스트). 비록 내가 그것을 걱정하지 않았지만. 어떻게 설명 할 수 있습니까?

답변

1

"onRetainNonConfigurationInstance()"와 같은 가장 큰 문제는 OS의 프로세스 수명주기 동안 앱 활동의 파괴 및 재창조를 고려하지 않는다는 것입니다. See the documentation for this here. 기본적으로 앱이 백그라운드에 있고 다른 장치 앱을 사용할 때 OS가 프로세스를 중단하여 시스템 리소스를 해제하기 시작합니다. 이런 일이 발생하고 앱을 다시 열면 OS는 savedInstanceState를 통해 애플리케이션을 다시 생성하려고 시도합니다.

내 응용 프로그램이 가로 모드를 지원하는지 여부에 관계없이 항상 방향 변경이 onRetainNonConfigurationInstance와 같은 것을 사용하지 않고 상태를 다시 만들도록 항상 원활하게 작동하는지 확인합니다.

는 여기가 OS가 발표 한 것 후 응용 프로그램 상태의 여가를 확인하기 위해 실행하는 간단한 테스트입니다 :

  1. 이 문제의 페이지에 응용 프로그램을 엽니 다.
  2. 휴대 전화의 '집'버튼을 누릅니다.
  3. 길게 스크롤하는 listViews가있는 3 개 이상의 리소스 사용률 앱을 엽니 다 (Facebook, Youtube 및 Google Play 스토어 사용).
  4. 각 응용 프로그램에서 시스템 리소스를 사용하기에 적절한 양만큼 목록보기를 스크롤하십시오.
  5. 3 가지 앱 모두 완료 한 후 앱을 다시 엽니 다.

무슨 일이 일어 났습니까? 상태 저장을 올바르게 처리했다면, 저장 한 savedInstanceState 번들에서 뷰를 다시 생성하는 애플리케이션을 볼 수 있습니다. 손실 된 데이터 또는 널 포인터 예외가있는 재 작성된보기를 볼 수도 있습니다.

두 번째 요점은 smitalm이 정확하다는 것입니다. OS는 올바르게 구성된 경우 기본보기 요소의 상태 저장을 처리합니다. 자세한 내용은 Recreating an Activity documentation을 확인하십시오.

희망이 도움이됩니다.

2

입력에 고유 ID가있는 경우 방향 변경시 상태가 저장됩니다.

방향 변경시 활동 상태를 저장하는 올바른 방법은 onSaveInstanceState() and onRestoreInstanceState()을 참조하십시오. 기본적으로 onSaveInstanceState (Bundle icicle)을 재정의 할 때 필요한 데이터가 번들에 있어야합니다 (메소드 매개 변수로 제공됨).

onRestoreInstanceState()을 덮어 쓰면이 데이터가 다시로드됩니다.

사용자 지정 개체를 저장해야 할 경우 Parcelable 인터페이스를 구현해야합니다.

Parcelable을 사용하지 않으려는 경우 개체를 JSON String으로 serialize하고 해당 String을 Bundle에 배치하면됩니다. Bundle은 이미 String을 지원합니다. 그런 다음 onRestoreInstanceState()에서 자바 객체로 JSON을 역 직렬화하면됩니다.

JSON 직렬화의 경우이 작업에 대해서는 google GSON을 적극 권장합니다.

+0

문제는 내 데이터 구조가 실제로 복잡하다는 것입니다. 차라리 구조체 Parcelable의 모든 객체를 만드는 대신 JSON serializer를 작성하는 편이 좋을 것입니다. 그러나 여전히, 나는이 간단한 작업 ("그냥 아무것도하지 마라.")의 오버 헤드처럼 느낀다. – Chris

+0

@Chris 나는 단지 국가를 저장하기에는 너무 많은 일이 느껴진다는 것에 동의하지만, 안드로이드가 설계된 방법은 :). parcelable을 사용하는 대신 JSON String으로 serialize하고 String을 Bundle에 넣을 수 있습니다 (Bundle은 이미 String을 지원하므로). – hendrix