내가 저장하고의 상태를 복원하기 위해 노력하고있어 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)
.