onSaveInstanceState () 및 onRestoreInstanceState () Activity방법을 사용을 onSaveInstanceState()하고 onRestoreInstanceState(). 문제는 onRestoreInstanceState()메소드에 절대

내가 저장하고의 상태를 복원하기 위해 노력하고있어 Activity방법을 사용을 onSaveInstanceState()하고 onRestoreInstanceState().

문제는 onRestoreInstanceState()메소드에 절대 들어 가지 않는다는 것입니다. 왜 이것이 나에게 설명 할 수 있습니까?



답변

일반적으로에서 상태를 복원합니다 onCreate(). 복원도 가능 onRestoreInstanceState()하지만 일반적이지 않습니다. ( onRestoreInstanceState()이후 onStart()에 호출 되는 반면 onCreate()에 , 전에 호출 됨) onStart().

put 메소드를 사용하여 다음에 값을 저장하십시오 onSaveInstanceState().

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putLong("param", value);
}

그리고 다음 값을 복원하십시오 onCreate().

public void onCreate(Bundle icicle) {
  if (icicle != null){
    value = icicle.getLong("param");
  }
}

답변

onRestoreInstanceState()라고 다시 때만 이 후 활동을 살해 OS에 의해. 이러한 상황은 다음과 같은 경우에 발생합니다.

  • 장치의 방향이 바뀝니다 (활동이 파괴되고 재 생성됨).
  • 당신 앞에 또 다른 활동이 있으며 어떤 시점에서 OS는 메모리를 확보하기 위해 활동을 종료합니다 (예 :). 다음에 활동을 시작하면 onRestoreInstanceState ()가 호출됩니다.

대조적으로 : 활동 중이고 Back장치의 버튼을 누르면 활동이 완료되고 (즉, 데스크탑 응용 프로그램을 종료하는 것으로 생각) 다음에 응용 프로그램을 시작할 때 “새로”시작됩니다. 당신이 때렸을 때 의도적으로 종료했기 때문에 저장된 상태 Back.

다른 혼란의 원인은 앱 onSaveInstanceState()이 다른 앱에 대한 포커스를 잃을 때 호출되지만 앱 으로 다시 탐색하면 onRestoreInstanceState()호출되지 않을 수 있다는 것입니다. 이것은 원래의 질문에 설명 된 경우입니다. 즉, 다른 활동이 시작된 기간 동안 활동이 종료되지 않은 경우 onRestoreInstanceState()활동이 거의 “활성”이기 때문에 호출되지 않습니다.

에 대한 문서에 명시된 바와 같이 onRestoreInstanceState():

대부분의 구현은 단순히 onCreate (Bundle)를 사용하여 상태를 복원하지만 모든 초기화가 완료된 후 여기에서 수행하거나 하위 클래스가 기본 구현을 사용할지 여부를 결정하도록하는 것이 편리한 경우가 있습니다. 이 메소드의 기본 구현은 onSaveInstanceState (Bundle)에 의해 이전에 정지 된 모든 뷰 상태의 복원을 수행합니다.

내가 읽은대로 : onRestoreInstanceState()서브 클래스를 작성하지 않고 Activity누군가가 서브 클래스를 서브 클래스 화 할 것으로 예상 되지 않는 한 재정의 할 이유가 없습니다 .


답변

저장 한 상태 onSaveInstanceState()는 나중에 onCreate()메소드 호출시 사용 가능 합니다. 따라서 onCreate(및 해당 Bundle매개 변수)를 사용 하여 활동 상태를 복원하십시오.


답변

임시 해결책으로 활동 A를 시작하는 데 사용하려는 의도로 유지하려는 데이터가있는 번들을 저장할 수 있습니다.

Intent intent = new Intent(this, ActivityA.class);
intent.putExtra("bundle", theBundledData);
startActivity(intent);

활동 A는 이것을 활동 B로 다시 전달해야합니다. 활동 B의 onCreate 메소드에서 의도를 검색합니다.

Intent intent = getIntent();
Bundle intentBundle;
if (intent != null)
    intentBundle = intent.getBundleExtra("bundle");
// Do something with the data.

또 다른 아이디어는 활동 상태를 저장하기 위해 저장소 클래스를 작성하고 각 활동이 해당 클래스를 참조하도록하는 것입니다 (단일 구조를 사용할 수 있음). 그러나 그렇게하는 것이 가치가있는 것보다 더 어려울 수 있습니다.


답변

중요한 것은 당신이 저장하지 않는 경우이다 onSaveInstanceState()onRestoreInstanceState()호출되지 않습니다. 이것의 주된 차이점이다 restoreInstanceState()하고 onCreate(). 실제로 무언가를 보관하십시오. 아마도 이것이 당신의 문제입니다.


답변

다른 활동이 포 그라운드로 올 때 onSaveInstanceState가 항상 호출된다는 것을 알았습니다. 그리고 onStop입니다.

그러나 onCreate 및 onStart가 호출 된 경우에만 onRestoreInstanceState가 호출되었습니다. 그리고 onCreate 및 onStart가 항상 호출 된 것은 아닙니다.

따라서 활동이 백그라운드로 이동하더라도 Android가 항상 상태 정보를 삭제하지는 않는 것 같습니다. 그러나 라이프 사이클 메소드를 호출하여 상태를 안전하게 저장합니다. 따라서 상태가 삭제되지 않으면 Android는 수명주기 메소드를 호출하여 필요하지 않은 상태를 복원하지 않습니다.

그림 2 는이를 설명합니다.


답변

이 스레드는 꽤 오래되었다고 생각합니다. onSaveInstanceState()전화를 거는 경우라고도 하는 다른 사례를 언급 합니다 Activity.moveTaskToBack(boolean nonRootActivity).