onSaveInstanceState () 및 onRestoreInstanceState ()는 정확히 언제 호출됩니까?


102

공식 문서 의 다음 그림 은 Android 활동 의 잘 알려진 수명주기 를 설명합니다 .

여기에 이미지 설명 입력

(메모리 요구를 확보 할 수 있기 때문에 예를 들어) 활동이 시스템에 의해 파괴되는 한편, 상기 활동 상태는 때때로 자동으로되어 저장 및 복원 방법에 의해서 onSaveInstanceState()onRestoreInstanceState()또한 (다음 도표에 의해 도시 된 바와 같이, 에서 공식 문서 ) :

여기에 이미지 설명 입력

활동이 파괴 되려고 할 때 항상 호출 되는 onSaveInstanceState()것은 아니라는 것을 알고 있습니다. 예를 들어 사용자가 "뒤로"버튼을 눌러서 삭제 된 경우 활동 상태가 보존되지 않습니다. 그러나 상태 저장되고 복원되고 onSaveInstanceState()/ onRestoreInstanceState()호출되는 경우 정확히 언제 호출 됩니까?

예를 들어, 위의 수치에 따르면, onRestoreInstanceState()이전에 호출 할 수도 onStart(), 또는 이후 onStart()하지만 전 onResume()또는 후 onResume(). 마찬가지로 onSaveInstanceState(). 그렇다면 정확히 언제 호출됩니까?

이상적으로, 내가 원하는 것은 활동 라이프 사이클 상태와 저장 / 복원 방법을 보여주는 결합 된 다이어그램 을 보는 것 입니다.


Android 공식 문서, onSaveInstanceState ()에서 onPause ()와 onStop () 사이에 호출 된 최종 답변을 얻었습니다.
Rishi 2017

1
@Rishi 해당 문서에 대한 링크를 제공 할 수 있습니까?
Luis Mendo


당신의 활동 상태 저장 단락을 읽어보십시오
Rishi

여부를 내가 올바른 오전 여부를 명확히하십시오
리시

답변:


107

문서 :

void onRestoreInstanceState (savedInstanceState 번들)

이 메서드는 onStart()과 사이에 호출 onPostCreate(Bundle)됩니다.

void onSaveInstanceState (번들 outState)

이 메서드가 호출되면 Build.VERSION_CODES.P로 시작하는 플랫폼을 대상으로하는 애플리케이션의 onStop () 이후에 발생합니다. 이전 플랫폼 버전을 대상으로하는 애플리케이션의 경우이 메서드는 onStop () 이전에 발생하며 onPause () 이전 또는 이후에 발생하는지 여부에 대한 보장이 없습니다.


1
감사. 문서에 대한 링크를 제공해 주시겠습니까?
Luis Mendo

거기에 onStart ()와 onPostCreate () 사이에 다른 것이 없다고 생각하므로 onRestoreInstanceState ()가 체인에 잘 정의되어 있습니다.
Steve M

감사합니다. 이 문제를 명확히
루이스 Mendo에게

1
@SteveM "onPause () 이전 또는 이후에 발생할 것인지에 대한 보장이 없습니다."뷰에 액세스하려고하면 (목록 뷰의 인덱스처럼 저장할 값을 얻기 위해) NullPointerExceptions가 발생할 수 있다는 의미입니까?
Tiago

3
그렇다면 데이터 구조를 onPause에 저장하고 onSaveInstanceState 및 onRestoreInstanceState 대신 onResume에서 복원하는 것이 좋습니다.
Gödel77

18

당으로 DOC1doc2

onSaveInstanceState

Honeycomb 이전에는 활동이 일시 중지 될 때까지 종료 가능한 것으로 간주되지 않았습니다. 즉, onSaveInstanceState ()가 onPause () 직전에 호출되었음을 의미합니다. 그러나 Honeycomb부터 활동은 중지 된 후에 만 ​​종료 가능한 것으로 간주됩니다. 즉, onSaveInstanceState ()는 이제 onPause () 직전이 아니라 onStop () 전에 호출됩니다.

onRestoreInstanceState

이 메서드는 활동이 이전에 저장된 상태에서 다시 초기화 될 때 onStart ()와 onPostCreate (Bundle) 사이에서 호출됩니다.


길 좋아하는 당신은 다른 안드로이드 버전에 비해 시나리오를 설명
Jimit 파텔에게

14

이미 게시 된 답변 외에도 Android P에는 다음과 같은 미묘한 변경 사항이 있습니다.

void onSaveInstanceState (Bundle outState)

라는 경우,이 메소드가 발생합니다 AFTER onStop() 로 시작하는 플랫폼을 대상으로 응용 프로그램 P를 . 이전 플랫폼 버전을 대상으로하는 응용 프로그램의 경우이 방법은 이전에 onStop()발생하며 이전 또는 이후에 발생할지 여부에 대한 보장이 없습니다 onPause().

출처 : 문서

이 변경 사항이 도입 된 이유에 대한 답변은 다음과 같습니다.

... 애플리케이션이 안전하게 조각 트랜잭션을 수행 onStop()할 수 있으며 나중에 영구 상태를 저장할 수 있습니다.

출처 : 문서


안녕하세요, 좋은 의견입니다. P를 대상으로하지만 하위 API에서 실행되는 앱이 어떻게 동작할지 알고 있습니까? 하위 API를 대상으로하는 앱과 동일하거나 API 전체에서 일관되고 "대상 지정 API"동작을 유지합니까?
Filipkowicz 2019

@Filipkowicz, Do you know how will behave app that target P but runs on lower api?앱이 M에서 실행되는 한,이 기기에있는 Android 버전에는 P에 도입 된 변경 사항이 포함되어 있지 않습니다. 즉, P표시되지 않는 대상을 지정했는지 여부에 관계없이 Pre-P 장치에 따라 다릅니다. 이것이 귀하의 질문에 답하기를 바랍니다.
azizbekian

나는이 답변을 읽은 후 오늘 너무 편안하다고 느낍니다. 왜냐하면 나는 Udacity에서 안드로이드 무료 코스를하고 있었기 때문에 레슨 5 연습 8에서 onStop 및 onDestroy 메소드가 거기에 있으면 안된다고 설명하는 이전 버전의 튜토리얼을 가지고 있기 때문입니다. 표시된 textView. 그러나 나는 그것이 안드로이드의 이전 버전에 대한 것인지 몰랐고 안드로이드 파이에서 내 응용 프로그램을 실행하고 있었고 내 textView에서 onStop 메소드를 얻고있었습니다. 정말 고맙습니다. 마침내 기분이 좋아졌습니다.
Sandhu

6

onSaveInstanceState (Bundle)에 대한 추가 정보입니다.

문서에서

이 메서드를 활동이 백그라운드에 배치되거나 소멸 될 때 항상 호출되는 onPause () 또는 소멸 전에 호출되는 onStop ()과 같은 활동 라이프 사이클 콜백과 혼동하지 마십시오. onPause () 및 onStop ()이 호출되고이 메서드가 아닌 경우의 한 예는 사용자가 활동 B에서 활동 A로 다시 이동할 때입니다. 특정 인스턴스가 복원되지 않으므로 B에서 onSaveInstanceState (Bundle)를 호출 할 필요가 없습니다. , 그래서 시스템은 그것을 호출하지 않습니다. onSaveInstanceState (Bundle)가 아닌 onPause ()가 호출되는 예는 활동 B가 활동 A 앞에서 시작되는 경우입니다. 시스템은 활동 A에 대해 onSaveInstanceState (Bundle)을 호출하지 않을 수 있습니다. A의 사용자 인터페이스 상태는 그대로 유지됩니다.

그래서 기본 구현입니다 ..

기본 구현은 ID가있는 계층 구조의 각 뷰에서 onSaveInstanceState ()를 호출하고 현재 포커스 된 뷰의 ID를 저장하여 인스턴스 별 UI 상태를 대부분 처리합니다 (모두 onRestoreInstanceState (Bundle))의 기본 구현입니다. 이 메서드를 재정 의하여 각 개별보기에서 캡처하지 않은 추가 정보를 저장하는 경우 기본 구현을 호출 할 수 있습니다. 그렇지 않으면 각보기의 모든 상태를 직접 저장할 준비를해야합니다.


0
String activityState;
@Override 
public void onCreate(Bundle savedInstanceState) {
// call the super class onCreate to complete the creation of activity like 
// the view hierarchy 
super.onCreate(savedInstanceState);

// recovering the instance state 
if (savedInstanceState != null) {
     activityState = savedInstanceState.getString(STATE_KEY);
 } 

   setContentView(R.layout.main_activity);
   mTextView = (TextView) findViewById(R.id.text_view);
} 

//이 콜백은 // onSaveInstanceState ()를 사용하여 이전에 저장 한 저장된 인스턴스가있는 경우에만 호출됩니다. onCreate ()에서 일부 상태를 복원하는 반면, 선택적으로 여기에서 다른 상태를 복원 할 수 있습니다. // onStart ()가 완료된 후에 사용할 수 있습니다. // savedInstanceState Bundle은 onCreate ()에서 사용 된 것과 동일합니다.

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) {
 mTextView.setText(savedInstanceState.getString(STATE_KEY));
  } 


// invoked when the activity may be temporarily destroyed, save the instance 
//state here 
//this method will be called before onstop

@Override 
 public void onSaveInstanceState(Bundle outState) {
    outState.putString(STATE_KEY, activityState);

    // call superclass to save any view hierarchy 
    super.onSaveInstanceState(outState);
} 

실례합니다. 이것이 저장 / 복원 메서드가 정확히 언제 호출 되는지 질문에 어떻게 대답 합니까?
루이스 Mendo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.