1page.title=액티비티 재생성하기
2page.tags=activity lifecycle
3helpoutsWidget=true
4
5trainingnavtop=true
6
7@jd:body
8
9<div id="tb-wrapper">
10  <div id="tb">
11
12    <h2>이 과정에서 다루는 내용</h2>
13    <ol>
14      <li><a href="#SaveState">액티비티 상태 저장하기</a></li>
15      <li><a href="#RestoreState">액티비티 상태 복원하기</a></li>
16    </ol>
17
18    <h2>필독 항목</h2>
19    <ul>
20      <li><a href="{@docRoot}training/basics/supporting-devices/screens.html">다양한
21화면 지원</a></li>
22      <li><a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경 처리하기</a></li>
23      <li><a href="{@docRoot}guide/components/activities.html">액티비티</a>
24      </li>
25    </ul>
26
27  </div>
28</div>
29
30<p>정상적인 앱 동작으로 인해 액티비티가 소멸되는 몇 가지 시나리오가 있습니다.
31예를 들어 사용자가 <em>뒤로</em> 버튼을 누르거나 액티비티가 {@link android.app.Activity#finish()}를 호출하여
32자체적인 소멸 신호를 보내는 경우입니다. 또한 액티비티가
33현재 정지되어 있고 장시간 사용되지 않거나, 전면에 있는 액티비티가 더 많은
34리소스를 필요로 하여 시스템이 백그라운드 프로세스를 종료해서 메모리를 회수해야 하는 경우에도 시스템이 액티비티를 소멸시킬 수 있습니다.</p>
35
36<p>사용자가 <em>뒤로</em> 버튼을 누르거나 액티비티가
37스스로 종료되어 소멸된 경우, {@link android.app.Activity} 인스턴스에 대한 시스템의 개념은 완전히 사라지게 됩니다. 왜냐하면
38동작이 액티비티가 더 이상 필요치 않다는 것을 나타내기 때문입니다. 하지만 시스템이 정상적인 앱 동작이 아닌 시스템 제약 조건으로 인해
39액티비티를 소멸한 경우, 실제
40{@link android.app.Activity} 인스턴스는 사라지지만 시스템은 그것이 존재하고 있었음을 기억합니다. 예를 들어
41사용자가 다시 해당 액티비티를 탐색하면, 시스템은 소멸된 액티비티의 상태를 설명하는
42저장된 데이터 세트를 사용하여 액티비티의 새 인스턴스를 생성합니다. 시스템이
43이전 상태를 복원하기 위해 사용하는 저장된 데이터를 "인스턴스 상태"라고 하며, 이는 {@link android.os.Bundle} 개체에 저장된
44키-값 쌍의 컬렉션입니다.</p>
45
46<p class="caution"><strong>주의:</strong> 사용자가 화면을 회전할 때마다
47액티비티가 소멸되고 재생성됩니다. 화면 방향이 바뀌면 시스템은
48전면에 있는 액티비티를 소멸하고 재생성합니다. 그 이유는 화면 구성이 바뀌었으며, 액티비티가 레이아웃과 같은 대체 리소스를
49로딩해야 할 수 있기 때문입니다.</p>
50
51<p>기본적으로 시스템은 {@link android.os.Bundle} 인스턴스 상태를 사용하여 액티비티 레이아웃의 각 {@link android.view.View} 개체에 대한
52정보를 저장합니다(예: {@link android.widget.EditText} 개체에
53입력된 텍스트 값 등). 따라서 액티비티 인스턴스가 소멸되고
54재생성된 경우, 레이아웃의 상태는
55별도의 코드 요청 없이 이전 상태로 복원됩니다. 하지만
56액티비티에서 사용자 진행 상태를
57추적하는 멤버 변수처럼 액티비티에 복원하고자 하는 상태 정보가 더 많이 있는 경우도 있습니다.</p>
58
59<p class="note"><strong>참고:</strong> Android 시스템이 액티비티에서
60보기의 상태를 복원하기 위해서는
61<a href="{@docRoot}reference/android/view/View.html#attr_android:id">{@code
62android:id}</a> 특성으로 제공되는 <strong>고유 ID가 각 보기마다 있어야 합니다</strong>.</p>
63
64<p>액티비티 상태에 대한 추가 데이터를 저장하려면
65{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} 콜백 메서드를 재정의해야 합니다.
66시스템은 사용자가 액티비티를 떠날 경우 이 메서드를 호출하며,
67액티비티가 예기치 않게 소멸될 경우 저장되는
68{@link android.os.Bundle} 개체로 전달합니다. 시스템이
69나중에 액티비티 인스턴스를 재생성해야 하는 경우, 동일한 {@link
70android.os.Bundle} 개체를 {@link android.app.Activity#onRestoreInstanceState
71onRestoreInstanceState()} 및 {@link android.app.Activity#onCreate onCreate()}
72메서드 모두에 전달합니다.</p>
73
74<img src="{@docRoot}images/training/basics/basic-lifecycle-savestate.png" />
75<p class="img-caption"><strong>그림 2.</strong> 시스템은 액티비티 중지 작업을 시작할 때
76{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}(1)를 호출합니다.
77따라서 {@link android.app.Activity} 인스턴스가
78재생성되어야 하는 경우 저장하고자 하는 추가 상태 데이터를 지정할 수 있습니다.
79액티비티가 소멸되고 동일한 인스턴스가 재생성되어야 하는 경우, 시스템은 {@link android.app.Activity#onCreate onCreate()} 메서드(2)
80및 {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} 메서드(3)
81모두에 (1)에서 정의된 상태
82데이터를 전달합니다.</p>
83
84
85
86<h2 id="SaveState">액티비티 상태 저장하기</h2>
87
88<p>액티비티의 정지 작업 시작 시 시스템은 {@link android.app.Activity#onSaveInstanceState
89onSaveInstanceState()}를 호출합니다. 이에 따라 액티비티는 키-값
90쌍 컬렉션과 함께 상태 정보를 저장할 수 있습니다. 메서드의 기본 구현은 {@link android.widget.EditText} 위젯 내 텍스트 또는 {@link android.widget.ListView}의 스크롤
91위치와 같은 액티비티의
92보기 계층 구조에 대한 정보를 저장합니다.</p>
93
94<p>액티비티에 대한 추가 상태 정보를 저장하려면 {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}를
95구현한 다음 {@link android.os.Bundle} 개체에
96키-값 쌍을 추가해야 합니다. 예를 들면 다음과 같습니다.</p>
97
98<pre>
99static final String STATE_SCORE = "playerScore";
100static final String STATE_LEVEL = "playerLevel";
101...
102
103&#64;Override
104public void onSaveInstanceState(Bundle savedInstanceState) {
105    // Save the user's current game state
106    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
107    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
108
109    // Always call the superclass so it can save the view hierarchy state
110    super.onSaveInstanceState(savedInstanceState);
111}
112</pre>
113
114<p class="caution"><strong>주의:</strong> 항상 {@link
115android.app.Activity#onSaveInstanceState onSaveInstanceState()}의 슈퍼클래스 구현을 호출하여 기본 구현에서
116보기 계층 구조를 저장할 수 있도록 합니다.</p>
117
118
119
120<h2 id="RestoreState">액티비티 상태 복원하기</h2>
121
122<p>액티비티가 이전에 소멸된 후 재생성되면, 시스템이 액티비티를
123전달한 {@link android.os.Bundle}로부터 저장된
124상태를 복구할 수 있습니다. {@link android.app.Activity#onCreate onCreate()} 및 {@link
125android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} 콜백 메서드 둘 다 인스턴스 상태 정보를 포함하는
126동일한 {@link android.os.Bundle}을 수신합니다.</p>
127
128<p>{@link android.app.Activity#onCreate onCreate()} 메서드는
129시스템이 액티비티의 새 인스턴스를 생성하든, 이전 인스턴스를 재생성하든 상관없이 호출되므로, 읽기를 시도하기 전에 상태 {@link android.os.Bundle}이 null인지
130반드시 확인해야 합니다. null일 경우,
131시스템은 이전에 소멸된 액티비티의 인스턴스를
132복원하지 않고 새 인스턴스를 생성합니다.</p>
133
134<p>다음은 {@link android.app.Activity#onCreate
135onCreate()}에서 몇 가지 상태 데이터를 복원하는 방법에 대한 예제입니다.</p>
136
137<pre>
138&#64;Override
139protected void onCreate(Bundle savedInstanceState) {
140    super.onCreate(savedInstanceState); // Always call the superclass first
141
142    // Check whether we're recreating a previously destroyed instance
143    if (savedInstanceState != null) {
144        // Restore value of members from saved state
145        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
146        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
147    } else {
148        // Probably initialize members with default values for a new instance
149    }
150    ...
151}
152</pre>
153
154<p>{@link android.app.Activity#onCreate onCreate()} 중에 상태를 복원하는
155대신, 시스템이 {@link android.app.Activity#onStart()} 메서드 후에
156호출하는 {@link
157android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}를 구현하도록 선택할 수 있습니다. 시스템은 복원할 저장
158상태가 있을 경우에만 {@link
159android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}를 호출합니다. 따라서 {@link android.os.Bundle}이 null인지 확인할 필요가 없습니다.</p>
160
161<pre>
162public void onRestoreInstanceState(Bundle savedInstanceState) {
163    // Always call the superclass so it can restore the view hierarchy
164    super.onRestoreInstanceState(savedInstanceState);
165
166    // Restore state members from saved instance
167    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
168    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
169}
170</pre>
171
172<p class="caution"><strong>주의:</strong> 항상 {@link
173android.app.Activity#onSaveInstanceState onSaveInstanceState()}의 슈퍼클래스 구현을 호출하여 기본 구현에서 보기 계층 구조의 상태를
174복원할 수 있도록 합니다.</p>
175
176<p>런타임에
177재시작 이벤트로 인한 액티비티 재생성과 관련한 자세한 내용은 <a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경 처리하기</a>를 참조하세요.</p>
178
179